diff --git a/Results/BatchResults.cs b/Results/BatchResults.cs index 0432f040c..9d7fa9cc2 100644 --- a/Results/BatchResults.cs +++ b/Results/BatchResults.cs @@ -189,6 +189,15 @@ namespace Results return null; } + public MeterTestRslt GetEachMeterTestRslt(string name, int wmNr0, CompoundMeterId meterId) + { + if (Batch.WaterMeters != null && Batch.WaterMeters.Count > wmNr0) + { + return Batch.WaterMeters[wmNr0].GetMeterTestRslt(name, meterId); + } + return null; + } + /// /// Returns true when all tests were done diff --git a/Results/DB.cs b/Results/DB.cs index 23f06a0a2..e76074d55 100644 --- a/Results/DB.cs +++ b/Results/DB.cs @@ -111,7 +111,7 @@ namespace Results if (SessionFactory == null) { DatabaseMigrationHelper.EnsureSchema(dbType, connectionString); - SessionFactory = CreateSessionFactory(); + SessionFactory = CreateSessionFactory(); } return SessionFactory.OpenSession(); @@ -273,8 +273,16 @@ namespace Results log.Debug(tstRslt.ToString(1)); } + // Save batch, TestRslt, WaterMeter, MeterTestRslt, etc. session.SaveOrUpdate(batch); + // Important: after this, TestRslt.Id should be generated + session.Flush(); + + // Optional table support + SolveSaveCalibFactors(batch, session); + + //Commit - store results transaction.Commit(); } catch (Exception exc) @@ -295,6 +303,51 @@ namespace Results return true; } + private static void SolveSaveCalibFactors(Batch batch, ISession session) + { + bool hasCalibrationFactors = false; + + try + { + + foreach (var tstRslt in batch.TestRslts) + { + if (tstRslt.CalibFactorResultsToSave != null && + tstRslt.CalibFactorResultsToSave.Count > 0) + { + hasCalibrationFactors = true; + break; + } + } + + if (hasCalibrationFactors) + { + + foreach (var tstRslt in batch.TestRslts) + { + if (tstRslt.CalibFactorResultsToSave == null || + tstRslt.CalibFactorResultsToSave.Count == 0) + { + continue; + } + + + foreach (var calib in tstRslt.CalibFactorResultsToSave) + { + calib.TestRslt = tstRslt; + calib.ErrorStr = TestRsltCalibFactorHelper.Truncate(calib.ErrorStr, 240); + + session.SaveOrUpdate(calib); + } + } + } + }catch(Exception exc) + { + log.ErrorFormat("DB - Cannot save calibration factors: {0}", exc.Message); + throw; + } + } + public static Batch LoadBatch(int batchNr) { @@ -321,6 +374,14 @@ namespace Results batch.WaterMeters = session.QueryOver() .Where(x => (x.Batch.Id == batch.Id)) .List(); + + + foreach (var tstRslt in batch.TestRslts) + { + tstRslt.CalibFactorResultsToSave = TestRsltCalibFactorHelper.GetByTestRsltId( session, tstRslt.Id); + } + + } return (batches.Count > 0) ? batches[0] : null; diff --git a/Results/Entities/MeterTestCalibFactorRslt.cs b/Results/Entities/MeterTestCalibFactorRslt.cs new file mode 100644 index 000000000..af2a22f83 --- /dev/null +++ b/Results/Entities/MeterTestCalibFactorRslt.cs @@ -0,0 +1,37 @@ +namespace Results.Entities +{ + public class MeterTestCalibFactorRslt + { + public virtual int Id { get; protected set; } + + public virtual MeterTestRslt MeterTestRslt { get; set; } + + /// 1, 2, 3 - calculated calib factor index + public virtual int CalibFactorIndex { get; set; } + + /// Base calib factor originally set in meter + public virtual int BaseCalibFactor { get; set; } + + /// Newly calculated calib factor + public virtual int CalculatedCalibFactor { get; set; } + + /// true = calculated value was stored/written to meter + public virtual bool Stored { get; set; } + + public virtual string ErrorStr { get; set; } // max 240 chars + + public virtual double TimeStart { get; set; } + public virtual double TimeEnd { get; set; } + + public virtual double CalibRawStart { get; set; } + public virtual double CalibRawEnd { get; set; } + + public virtual double Error { get; set; } + + public MeterTestCalibFactorRslt() + { + Stored = false; + ErrorStr = string.Empty; + } + } +} diff --git a/Results/Entities/MeterTestRslt.cs b/Results/Entities/MeterTestRslt.cs index 3ca3854a3..763050c84 100644 --- a/Results/Entities/MeterTestRslt.cs +++ b/Results/Entities/MeterTestRslt.cs @@ -59,7 +59,11 @@ namespace Results.Entities #endif public virtual WaterMeter WaterMeter { get; set; } /// reference to the WaterMeter entity - public virtual TestRslt TestRslt { get; set; } /// reference to the TestRslt entity + public virtual TestRslt TestRslt { get; set; } + + /// reference to the TestRslt entity + + public virtual int Q3Channel { get; set; } /// Wrappers public virtual string Name() { return TestRslt.Name(); } @@ -99,6 +103,7 @@ namespace Results.Entities public virtual WaterMeterData WaterMeterData() { return WaterMeter.WaterMeterData; } public virtual Batch Batch() { return WaterMeter.Batch; } + public virtual bool IsPilotRslt() { return (CompoundMeterId == (byte)Common.CompoundMeterId.Single) || diff --git a/Results/Entities/TestRslt.cs b/Results/Entities/TestRslt.cs index 4f3e5afe4..dd0803cbf 100644 --- a/Results/Entities/TestRslt.cs +++ b/Results/Entities/TestRslt.cs @@ -11,6 +11,32 @@ namespace Results.Entities { public class TestRslt { + + /// Gets the three channel records for one physical meter, in channel order. + public virtual IList GetCalibrationFactors(WaterMeter meter) + { + if (meter == null) throw new ArgumentNullException(nameof(meter)); + lock (this) + { + if (CalibFactorResultsToSave == null) CalibFactorResultsToSave = new List(); + var result = new List(3); + for (int channel = 1; channel <= 3; channel++) + { + TestRsltCalibFactor found = null; + foreach (var row in CalibFactorResultsToSave) + if (row.WaterMeterPosition == meter.WMPosition && row.CalibFactorIndex == channel) + { found = row; break; } + if (found == null) + { + found = new TestRsltCalibFactor { TestRslt = this, WaterMeterPosition = meter.WMPosition, CalibFactorIndex = channel }; + CalibFactorResultsToSave.Add(found); + } + result.Add(found); + } + return result; + } + } + /// Identity public virtual int Id { get; protected set; } public virtual Batch Batch { get; set; } @@ -152,6 +178,11 @@ namespace Results.Entities public virtual int Counter4 { get; set; } public virtual int Counter5 { get; set; } + /// + /// Not maped table - exist only in Genesis DB !! + /// + public virtual IList CalibFactorResultsToSave { get; set; } + /// Wrappers public virtual string Name() { return Common.Utils.GetTestName(TestData.Name, TestData.Repeats, RepetitionNr); } public virtual string Key() { return string.Format("{0}~{1}~{2}~{3}", TestData.Name, Part, TestData.Repeats, RepetitionNr); } /// Unique key @@ -266,15 +297,27 @@ namespace Results.Entities MethodClass = string.Empty; Remark = string.Empty; + + CalibFactorResultsToSave = new List(); } - public TestRslt(Batch batch, TestData testData, int part, int repetitionNr) + public TestRslt( + Batch batch, + TestData testData, + int part, + int repetitionNr) + : this(batch, testData, part, repetitionNr, null) + { + } + + public TestRslt(Batch batch, TestData testData, int part, int repetitionNr, List calibFactor) : this() { Batch = batch; TestData = testData; Part = part; RepetitionNr = repetitionNr; + CalibFactorResultsToSave = calibFactor != null ? new List(calibFactor) : new List(); } public virtual void CopyContentFrom(TestRslt src) diff --git a/Results/Entities/TestRsltCalibFactor.cs b/Results/Entities/TestRsltCalibFactor.cs new file mode 100644 index 000000000..305f7e472 --- /dev/null +++ b/Results/Entities/TestRsltCalibFactor.cs @@ -0,0 +1,39 @@ +namespace Results.Entities +{ + public class TestRsltCalibFactor + { + public virtual int Id { get; protected set; } + + public virtual TestRslt TestRslt { get; set; } + + public virtual int WaterMeterPosition { get; set; } + + public virtual int CalibFactorIndex { get; set; } // 1, 2, 3 + + public virtual bool IsCalibFactorValid { get; set; } + + public virtual int BaseCalibFactor { get; set; } + public virtual int CalculatedCalibFactor { get; set; } + + public virtual bool Stored { get; set; } + + public virtual string ErrorStr { get; set; } // varchar(240) + + public virtual double TimeStart { get; set; } + public virtual double TimeEnd { get; set; } + + public virtual double CalibRawStart { get; set; } + public virtual double CalibRawEnd { get; set; } + + public virtual double Error { get; set; } + public virtual double VolumeStart { get; set; } + public virtual double VolumeEnd { get; set; } + + public TestRsltCalibFactor() + { + Stored = false; + ErrorStr = string.Empty; + IsCalibFactorValid = false; + } + } +} diff --git a/Results/Entities/WaterMeter.cs b/Results/Entities/WaterMeter.cs index f5cae7c8c..9b7ddc374 100644 --- a/Results/Entities/WaterMeter.cs +++ b/Results/Entities/WaterMeter.cs @@ -124,6 +124,9 @@ namespace Results.Entities public virtual bool LastRecordIsNok { get; set; } /// Not mapped to DB !!! Previous record verification result public virtual bool PrintLabel { get; set; } /// Not mapped to DB !!! + /// mapped to DB !!! Q3 channel number + public virtual int Q3Channel { get; set; } + public virtual WaterMeterData WaterMeterData { get; set; } public virtual Batch Batch { get; set; } public virtual IList MeterTestRslts { get; set; } @@ -506,6 +509,7 @@ namespace Results.Entities FWVersion = string.Empty; #endif PrintLabel = true; + Q3Channel = 0; //No Q3 calibration by default } @@ -570,6 +574,7 @@ namespace Results.Entities Workflow = src.Workflow; /// Not mapped to DB LastRecordIsNok = src.LastRecordIsNok; /// Not mapped to DB PrintLabel = src.PrintLabel; /// Not mapped to DB + Q3Channel = src.Q3Channel; /// Mapped to DB foreach (var mtr in MeterTestRslts) { @@ -611,9 +616,10 @@ namespace Results.Entities foreach (var mtr in MeterTestRslts) { if ((mtr.CompoundMeterId == (byte)CompoundMeterId.Single || mtr.CompoundMeterId == (byte)CompoundMeterId.Compound || mtr.CompoundMeterId == (byte)CompoundMeterId.HeatMeterEnergy) - && mtr.TestDone + && (mtr.Q3Channel != 0 || + (mtr.TestDone && (mtr.Publish() != Publish.Never) - && (mtr.Publish() != Publish.Internal)) + && (mtr.Publish() != Publish.Internal)))) { testNames.Add(mtr.Name()); } diff --git a/Results/Entities/WaterMeterData.cs b/Results/Entities/WaterMeterData.cs index 5eaf6e3a0..f924def90 100644 --- a/Results/Entities/WaterMeterData.cs +++ b/Results/Entities/WaterMeterData.cs @@ -51,6 +51,7 @@ namespace Results.Entities public virtual bool Compound { get; set; } public virtual bool HeatMeter { get; set; } public virtual int WMTypeId { get; set; } /// Mapped to DB only when ORACLE_DB is defined + public virtual int Q3Channel { get; set; } /// Q3 Channel = 0 no set > 0 is Q3 calibration /// /// Default constructor, safe values @@ -59,6 +60,7 @@ namespace Results.Entities { PulsesPerLtr = 1; PulsesPerLtrAux = 1; + Q3Channel = 0; } /// @@ -101,6 +103,7 @@ namespace Results.Entities Compound = oriWMData.Compound; HeatMeter = oriWMData.HeatMeter; WMTypeId = oriWMData.WMTypeId; + Q3Channel = oriWMData.Q3Channel; } @@ -146,6 +149,7 @@ namespace Results.Entities if (Compound != wmd.Compound) return false; if (HeatMeter != wmd.HeatMeter) return false; if (WMTypeId != wmd.WMTypeId) return false; + if (Q3Channel != wmd.Q3Channel) return false; return true; } diff --git a/Results/Entities/helpers/DatabaseMigrationHelper.cs b/Results/Entities/helpers/DatabaseMigrationHelper.cs index 1b85685f7..33f231bc7 100644 --- a/Results/Entities/helpers/DatabaseMigrationHelper.cs +++ b/Results/Entities/helpers/DatabaseMigrationHelper.cs @@ -29,12 +29,48 @@ namespace Results.Entities.helpers using (var conn = new MySqlConnection(connectionString)) { conn.Open(); + using (var create = conn.CreateCommand()) + { + create.CommandText = "CREATE TABLE IF NOT EXISTS TestRsltCalibFactor (Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, TestRsltId INT NOT NULL DEFAULT 0, WaterMeterPosition INT NOT NULL DEFAULT 0, IsCalibFactorValid INT NOT NULL DEFAULT 0, VolumeStart DOUBLE NOT NULL DEFAULT 0, VolumeEnd DOUBLE NOT NULL DEFAULT 0, CalibFactorIndex INT NOT NULL DEFAULT 0, BaseCalibFactor INT NOT NULL DEFAULT 0, CalculatedCalibFactor INT NOT NULL DEFAULT 0, Stored INT NOT NULL DEFAULT 0, ErrorStr VARCHAR(240) NULL, TimeStart DOUBLE NOT NULL DEFAULT 0, TimeEnd DOUBLE NOT NULL DEFAULT 0, CalibRawStart DOUBLE NOT NULL DEFAULT 0, CalibRawEnd DOUBLE NOT NULL DEFAULT 0, Error DOUBLE NOT NULL DEFAULT 0)"; + create.ExecuteNonQuery(); + } + EnsureColumnMySql(conn, "TestRsltCalibFactor", "TestRsltId", "INT NOT NULL DEFAULT 0"); + EnsureColumnMySql(conn, "TestRsltCalibFactor", "WaterMeterPosition", "INT NOT NULL DEFAULT 0"); + EnsureColumnMySql(conn, "TestRsltCalibFactor", "IsCalibFactorValid", "INT NOT NULL DEFAULT 0"); + EnsureColumnMySql(conn, "TestRsltCalibFactor", "VolumeStart", "DOUBLE NOT NULL DEFAULT 0"); + EnsureColumnMySql(conn, "TestRsltCalibFactor", "VolumeEnd", "DOUBLE NOT NULL DEFAULT 0"); + EnsureColumnMySql(conn, "TestRsltCalibFactor", "CalibFactorIndex", "INT NOT NULL DEFAULT 0"); + EnsureColumnMySql(conn, "TestRsltCalibFactor", "BaseCalibFactor", "INT NOT NULL DEFAULT 0"); + EnsureColumnMySql(conn, "TestRsltCalibFactor", "CalculatedCalibFactor", "INT NOT NULL DEFAULT 0"); + EnsureColumnMySql(conn, "TestRsltCalibFactor", "Stored", "INT NOT NULL DEFAULT 0"); + EnsureColumnMySql(conn, "TestRsltCalibFactor", "ErrorStr", "VARCHAR(240) NULL"); + EnsureColumnMySql(conn, "TestRsltCalibFactor", "TimeStart", "DOUBLE NOT NULL DEFAULT 0"); + EnsureColumnMySql(conn, "TestRsltCalibFactor", "TimeEnd", "DOUBLE NOT NULL DEFAULT 0"); + EnsureColumnMySql(conn, "TestRsltCalibFactor", "CalibRawStart", "DOUBLE NOT NULL DEFAULT 0"); + EnsureColumnMySql(conn, "TestRsltCalibFactor", "CalibRawEnd", "DOUBLE NOT NULL DEFAULT 0"); + EnsureColumnMySql(conn, "TestRsltCalibFactor", "Error", "DOUBLE NOT NULL DEFAULT 0"); + using (var create = conn.CreateCommand()) + { + create.CommandText = "CREATE TABLE IF NOT EXISTS MeterTestCalibFactorRslt (Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, MeterTestRslt_id INT NOT NULL DEFAULT 0, CalibFactorIndex INT NOT NULL DEFAULT 0, BaseCalibFactor INT NOT NULL DEFAULT 0, CalculatedCalibFactor INT NOT NULL DEFAULT 0, Stored INT NOT NULL DEFAULT 0, ErrorStr VARCHAR(240) NULL, TimeStart DOUBLE NOT NULL DEFAULT 0, TimeEnd DOUBLE NOT NULL DEFAULT 0, CalibRawStart DOUBLE NOT NULL DEFAULT 0, CalibRawEnd DOUBLE NOT NULL DEFAULT 0, Error DOUBLE NOT NULL DEFAULT 0)"; + create.ExecuteNonQuery(); + } + EnsureColumnMySql(conn, "MeterTestCalibFactorRslt", "MeterTestRslt_id", "INT NOT NULL DEFAULT 0"); + EnsureColumnMySql(conn, "MeterTestCalibFactorRslt", "CalibFactorIndex", "INT NOT NULL DEFAULT 0"); + EnsureColumnMySql(conn, "MeterTestCalibFactorRslt", "BaseCalibFactor", "INT NOT NULL DEFAULT 0"); + EnsureColumnMySql(conn, "MeterTestCalibFactorRslt", "CalculatedCalibFactor", "INT NOT NULL DEFAULT 0"); + EnsureColumnMySql(conn, "MeterTestCalibFactorRslt", "Stored", "INT NOT NULL DEFAULT 0"); + EnsureColumnMySql(conn, "MeterTestCalibFactorRslt", "ErrorStr", "VARCHAR(240) NULL"); + EnsureColumnMySql(conn, "MeterTestCalibFactorRslt", "TimeStart", "DOUBLE NOT NULL DEFAULT 0"); + EnsureColumnMySql(conn, "MeterTestCalibFactorRslt", "TimeEnd", "DOUBLE NOT NULL DEFAULT 0"); + EnsureColumnMySql(conn, "MeterTestCalibFactorRslt", "CalibRawStart", "DOUBLE NOT NULL DEFAULT 0"); + EnsureColumnMySql(conn, "MeterTestCalibFactorRslt", "CalibRawEnd", "DOUBLE NOT NULL DEFAULT 0"); + EnsureColumnMySql(conn, "MeterTestCalibFactorRslt", "Error", "DOUBLE NOT NULL DEFAULT 0"); - // Q3Channel migrations from develop/SLM-PT50_genesisDirectDecode_special_2. - // Kept as a visible template only; the related Q3 logic is not part of this change. - // EnsureColumnMySql(conn, "WaterMeterData", "Q3Channel", "INT NOT NULL DEFAULT 0"); - // EnsureColumnMySql(conn, "WaterMeter", "Q3Channel", "INT NOT NULL DEFAULT 0"); - // EnsureColumnMySql(conn, "MeterTestRslt", "Q3Channel", "INT NOT NULL DEFAULT 0"); + + // Genesis Q3 result columns. + EnsureColumnMySql(conn, "WaterMeterData", "Q3Channel", "INT NOT NULL DEFAULT 0"); + EnsureColumnMySql(conn, "WaterMeter", "Q3Channel", "INT NOT NULL DEFAULT 0"); + EnsureColumnMySql(conn, "MeterTestRslt", "Q3Channel", "INT NOT NULL DEFAULT 0"); EnsureColumnMySql(conn, "TestRslt", "ConductMean", "FLOAT NOT NULL DEFAULT 0"); EnsureColumnMySql(conn, "TestRslt", "ConductStart", "FLOAT NOT NULL DEFAULT 0"); @@ -135,12 +171,48 @@ namespace Results.Entities.helpers using (var conn = new System.Data.SQLite.SQLiteConnection("Data Source=" + databaseFile)) { conn.Open(); + using (var create = conn.CreateCommand()) + { + create.CommandText = "CREATE TABLE IF NOT EXISTS TestRsltCalibFactor (Id INTEGER PRIMARY KEY AUTOINCREMENT, TestRsltId INT NOT NULL DEFAULT 0, WaterMeterPosition INT NOT NULL DEFAULT 0, IsCalibFactorValid INT NOT NULL DEFAULT 0, VolumeStart DOUBLE NOT NULL DEFAULT 0, VolumeEnd DOUBLE NOT NULL DEFAULT 0, CalibFactorIndex INT NOT NULL DEFAULT 0, BaseCalibFactor INT NOT NULL DEFAULT 0, CalculatedCalibFactor INT NOT NULL DEFAULT 0, Stored INT NOT NULL DEFAULT 0, ErrorStr VARCHAR(240) NULL, TimeStart DOUBLE NOT NULL DEFAULT 0, TimeEnd DOUBLE NOT NULL DEFAULT 0, CalibRawStart DOUBLE NOT NULL DEFAULT 0, CalibRawEnd DOUBLE NOT NULL DEFAULT 0, Error DOUBLE NOT NULL DEFAULT 0)"; + create.ExecuteNonQuery(); + } + EnsureColumnSQLite(conn, "TestRsltCalibFactor", "TestRsltId", "INT NOT NULL DEFAULT 0"); + EnsureColumnSQLite(conn, "TestRsltCalibFactor", "WaterMeterPosition", "INT NOT NULL DEFAULT 0"); + EnsureColumnSQLite(conn, "TestRsltCalibFactor", "IsCalibFactorValid", "INT NOT NULL DEFAULT 0"); + EnsureColumnSQLite(conn, "TestRsltCalibFactor", "VolumeStart", "DOUBLE NOT NULL DEFAULT 0"); + EnsureColumnSQLite(conn, "TestRsltCalibFactor", "VolumeEnd", "DOUBLE NOT NULL DEFAULT 0"); + EnsureColumnSQLite(conn, "TestRsltCalibFactor", "CalibFactorIndex", "INT NOT NULL DEFAULT 0"); + EnsureColumnSQLite(conn, "TestRsltCalibFactor", "BaseCalibFactor", "INT NOT NULL DEFAULT 0"); + EnsureColumnSQLite(conn, "TestRsltCalibFactor", "CalculatedCalibFactor", "INT NOT NULL DEFAULT 0"); + EnsureColumnSQLite(conn, "TestRsltCalibFactor", "Stored", "INT NOT NULL DEFAULT 0"); + EnsureColumnSQLite(conn, "TestRsltCalibFactor", "ErrorStr", "VARCHAR(240) NULL"); + EnsureColumnSQLite(conn, "TestRsltCalibFactor", "TimeStart", "DOUBLE NOT NULL DEFAULT 0"); + EnsureColumnSQLite(conn, "TestRsltCalibFactor", "TimeEnd", "DOUBLE NOT NULL DEFAULT 0"); + EnsureColumnSQLite(conn, "TestRsltCalibFactor", "CalibRawStart", "DOUBLE NOT NULL DEFAULT 0"); + EnsureColumnSQLite(conn, "TestRsltCalibFactor", "CalibRawEnd", "DOUBLE NOT NULL DEFAULT 0"); + EnsureColumnSQLite(conn, "TestRsltCalibFactor", "Error", "DOUBLE NOT NULL DEFAULT 0"); + using (var create = conn.CreateCommand()) + { + create.CommandText = "CREATE TABLE IF NOT EXISTS MeterTestCalibFactorRslt (Id INTEGER PRIMARY KEY AUTOINCREMENT, MeterTestRslt_id INT NOT NULL DEFAULT 0, CalibFactorIndex INT NOT NULL DEFAULT 0, BaseCalibFactor INT NOT NULL DEFAULT 0, CalculatedCalibFactor INT NOT NULL DEFAULT 0, Stored INT NOT NULL DEFAULT 0, ErrorStr VARCHAR(240) NULL, TimeStart DOUBLE NOT NULL DEFAULT 0, TimeEnd DOUBLE NOT NULL DEFAULT 0, CalibRawStart DOUBLE NOT NULL DEFAULT 0, CalibRawEnd DOUBLE NOT NULL DEFAULT 0, Error DOUBLE NOT NULL DEFAULT 0)"; + create.ExecuteNonQuery(); + } + EnsureColumnSQLite(conn, "MeterTestCalibFactorRslt", "MeterTestRslt_id", "INT NOT NULL DEFAULT 0"); + EnsureColumnSQLite(conn, "MeterTestCalibFactorRslt", "CalibFactorIndex", "INT NOT NULL DEFAULT 0"); + EnsureColumnSQLite(conn, "MeterTestCalibFactorRslt", "BaseCalibFactor", "INT NOT NULL DEFAULT 0"); + EnsureColumnSQLite(conn, "MeterTestCalibFactorRslt", "CalculatedCalibFactor", "INT NOT NULL DEFAULT 0"); + EnsureColumnSQLite(conn, "MeterTestCalibFactorRslt", "Stored", "INT NOT NULL DEFAULT 0"); + EnsureColumnSQLite(conn, "MeterTestCalibFactorRslt", "ErrorStr", "VARCHAR(240) NULL"); + EnsureColumnSQLite(conn, "MeterTestCalibFactorRslt", "TimeStart", "DOUBLE NOT NULL DEFAULT 0"); + EnsureColumnSQLite(conn, "MeterTestCalibFactorRslt", "TimeEnd", "DOUBLE NOT NULL DEFAULT 0"); + EnsureColumnSQLite(conn, "MeterTestCalibFactorRslt", "CalibRawStart", "DOUBLE NOT NULL DEFAULT 0"); + EnsureColumnSQLite(conn, "MeterTestCalibFactorRslt", "CalibRawEnd", "DOUBLE NOT NULL DEFAULT 0"); + EnsureColumnSQLite(conn, "MeterTestCalibFactorRslt", "Error", "DOUBLE NOT NULL DEFAULT 0"); - // Q3Channel migrations from develop/SLM-PT50_genesisDirectDecode_special_2. - // Kept as a visible template only; the related Q3 logic is not part of this change. - // EnsureColumnSQLite(conn, "WaterMeterData", "Q3Channel", "INTEGER NOT NULL DEFAULT 0"); - // EnsureColumnSQLite(conn, "WaterMeter", "Q3Channel", "INTEGER NOT NULL DEFAULT 0"); - // EnsureColumnSQLite(conn, "MeterTestRslt", "Q3Channel", "INTEGER NOT NULL DEFAULT 0"); + + // Genesis Q3 result columns. + EnsureColumnSQLite(conn, "WaterMeterData", "Q3Channel", "INTEGER NOT NULL DEFAULT 0"); + EnsureColumnSQLite(conn, "WaterMeter", "Q3Channel", "INTEGER NOT NULL DEFAULT 0"); + EnsureColumnSQLite(conn, "MeterTestRslt", "Q3Channel", "INTEGER NOT NULL DEFAULT 0"); EnsureColumnSQLite(conn, "MeterTestRslt", "FlipMode", "INTEGER NULL"); EnsureColumnSQLite(conn, "WaterMeter", "CalibFactorNominal", "REAL NOT NULL DEFAULT 4096"); diff --git a/Results/Entities/helpers/TestRsltCalibFactorHelper.cs b/Results/Entities/helpers/TestRsltCalibFactorHelper.cs new file mode 100644 index 000000000..ba0707c89 --- /dev/null +++ b/Results/Entities/helpers/TestRsltCalibFactorHelper.cs @@ -0,0 +1,117 @@ +using System.Collections.Generic; +using log4net; +using NHibernate; + +namespace Results.Entities.helpers +{ + public static class TestRsltCalibFactorHelper + { + + private static readonly ILog log = LogManager.GetLogger(typeof(TestRsltCalibFactorHelper)); + + public static bool TableExists(ISession session) + { + try + { + session.CreateSQLQuery( "SELECT 1 FROM TestRsltCalibFactor LIMIT 1") + .UniqueResult(); + + return true; + } + catch + { + return false; + } + } + + public static void DeleteByTestRsltIdNoTransaction( + ISession session, + int testRsltId) + { + log.DebugFormat("Deleting TestRsltCalibFactor records for TestRsltId: {0}", testRsltId); + session.CreateSQLQuery(@" DELETE FROM TestRsltCalibFactor WHERE TestRsltId = :testRsltId") + .SetParameter("testRsltId", testRsltId) + .ExecuteUpdate(); + } + + public static IList GetByTestRsltId( + ISession session, + int testRsltId) + { + return session.QueryOver() + .Where(x => x.TestRslt.Id == testRsltId) + .OrderBy(x => x.CalibFactorIndex).Asc + .List(); + } + + public static string Truncate(string value, int maxLength) + { + if (string.IsNullOrEmpty(value)) + return string.Empty; + + return value.Length <= maxLength + ? value + : value.Substring(0, maxLength); + } + + public static void CreateTableIfNotExists(ISession session) + { + if (TableExists(session)) + return; + + string sql; + + if (DB.DbType == Common.DBType.MySql) + { + sql = @" +CREATE TABLE IF NOT EXISTS TestRsltCalibFactor ( + Id INT NOT NULL AUTO_INCREMENT, + TestRsltId INT NOT NULL, + CalibFactorIndex INT NOT NULL, + BaseCalibFactor INT NOT NULL, + CalculatedCalibFactor INT NOT NULL, + IsCalibFactorValid BIT NOT NULL, + Stored BIT NOT NULL, + ErrorStr VARCHAR(240) NULL, + TimeStart DOUBLE NOT NULL, + TimeEnd DOUBLE NOT NULL, + CalibRawStart DOUBLE NOT NULL, + CalibRawEnd DOUBLE NOT NULL, + Error DOUBLE NOT NULL, + VolumeStart DOUBLE NOT NULL, + VolumeEnd DOUBLE NOT NULL, + PRIMARY KEY (Id), + INDEX IX_TestRsltCalibFactor_TestRsltId (TestRsltId), + CONSTRAINT FK_TestRsltCalibFactor_TestRslt + FOREIGN KEY (TestRsltId) REFERENCES TestRslt(Id) + ON DELETE CASCADE +);"; + } + else + { + sql = @" +CREATE TABLE IF NOT EXISTS TestRsltCalibFactor ( + Id INTEGER PRIMARY KEY AUTOINCREMENT, + TestRsltId INTEGER NOT NULL, + CalibFactorIndex INTEGER NOT NULL, + BaseCalibFactor INTEGER NOT NULL, + CalculatedCalibFactor INTEGER NOT NULL, + IsCalibFactorValid INTEGER NOT NULL, + Stored INTEGER NOT NULL, + ErrorStr VARCHAR(240) NULL, + TimeStart DOUBLE NOT NULL, + TimeEnd DOUBLE NOT NULL, + CalibRawStart DOUBLE NOT NULL, + CalibRawEnd DOUBLE NOT NULL, + Error DOUBLE NOT NULL, + VolumeStart DOUBLE NOT NULL, + VolumeEnd DOUBLE NOT NULL, + FOREIGN KEY (TestRsltId) REFERENCES TestRslt(Id) ON DELETE CASCADE +);"; + } + + log.InfoFormat("Creating TestRsltCalibFactor table: {0}", sql); + session.CreateSQLQuery(sql).ExecuteUpdate(); + } + } +} diff --git a/Results/Forms/OneWMResultsColumnsCtrl.cs b/Results/Forms/OneWMResultsColumnsCtrl.cs index 79dc5e090..71d69e60b 100644 --- a/Results/Forms/OneWMResultsColumnsCtrl.cs +++ b/Results/Forms/OneWMResultsColumnsCtrl.cs @@ -69,7 +69,7 @@ namespace Results.Forms public void Update(Results.Entities.WaterMeter wMtr) { - if (wMtr == null || wMtr.Disabled) + if (wMtr == null || (wMtr.Disabled && wMtr.Q3Channel == 0)) { /// Water meter position is disabled this.disabled = true; diff --git a/Results/Forms/OneWMResultsRowsCtrl.cs b/Results/Forms/OneWMResultsRowsCtrl.cs index 0bef5365b..e281cb67d 100644 --- a/Results/Forms/OneWMResultsRowsCtrl.cs +++ b/Results/Forms/OneWMResultsRowsCtrl.cs @@ -81,7 +81,7 @@ namespace Results.Forms public void Update(Results.Entities.WaterMeter wMtr) { - if (wMtr == null || wMtr.Disabled) + if (wMtr == null || (wMtr.Disabled && wMtr.Q3Channel == 0)) { /// Water meter position is disabled this.disabled = true; @@ -114,8 +114,11 @@ namespace Results.Forms lView.Items.Clear(); foreach (var mtr in wMtr.MeterTestRslts) { - if (mtr != null && mtr.IsPilotRslt() && mtr.TestDone && mtr.Publish() != Publish.Never - && mtr.Publish() != Publish.Internal) + if (mtr != null && mtr.IsPilotRslt() && + (mtr.Q3Channel!=0 || (mtr.TestDone && + mtr.Publish() != Publish.Never && + mtr.Publish() != Publish.Internal) + ) ) { ListViewItem lvi = new ListViewItem(testNames[ix++]); diff --git a/Results/Mappings/MeterTestCalibFactorRsltMap.cs b/Results/Mappings/MeterTestCalibFactorRsltMap.cs new file mode 100644 index 000000000..52dfccb5a --- /dev/null +++ b/Results/Mappings/MeterTestCalibFactorRsltMap.cs @@ -0,0 +1,36 @@ +using FluentNHibernate.Mapping; +using Results.Entities; + +namespace Results.Mappings +{ + public class MeterTestCalibFactorRsltMap : ClassMap + { + public MeterTestCalibFactorRsltMap() + { + Id(x => x.Id); + + References(x => x.MeterTestRslt).Column("MeterTestRslt_id") + .Not.Nullable() + .Cascade.None(); + + Map(x => x.CalibFactorIndex).Not.Nullable(); + + Map(x => x.BaseCalibFactor).Not.Nullable(); + Map(x => x.CalculatedCalibFactor).Not.Nullable(); + + Map(x => x.Stored).Not.Nullable(); + + Map(x => x.ErrorStr) + .Length(240) + .Nullable(); + + Map(x => x.TimeStart).Not.Nullable(); + Map(x => x.TimeEnd).Not.Nullable(); + + Map(x => x.CalibRawStart).Not.Nullable(); + Map(x => x.CalibRawEnd).Not.Nullable(); + + Map(x => x.Error).Not.Nullable(); + } + } +} diff --git a/Results/Mappings/MeterTestRsltMap.cs b/Results/Mappings/MeterTestRsltMap.cs index 603babf17..4e6c1763e 100644 --- a/Results/Mappings/MeterTestRsltMap.cs +++ b/Results/Mappings/MeterTestRsltMap.cs @@ -50,6 +50,7 @@ namespace Results.Mappings #endif References(x => x.WaterMeter); References(x => x.TestRslt); + Map(x => x.Q3Channel); } } } diff --git a/Results/Mappings/TestRsltCalibFactorMap.cs b/Results/Mappings/TestRsltCalibFactorMap.cs new file mode 100644 index 000000000..da4c59c94 --- /dev/null +++ b/Results/Mappings/TestRsltCalibFactorMap.cs @@ -0,0 +1,43 @@ +using FluentNHibernate.Mapping; +using Results.Entities; + +namespace Results.Mappings +{ + class TestRsltCalibFactorMap : ClassMap + { + public TestRsltCalibFactorMap() + { + Id(x => x.Id); + + References(x => x.TestRslt) + .Column("TestRsltId") + .Not.Nullable(); + + Map(x => x.WaterMeterPosition).Not.Nullable(); + Map(x => x.CalibFactorIndex).Not.Nullable(); + Map(x => x.IsCalibFactorValid).Not.Nullable(); + + Map(x => x.BaseCalibFactor).Not.Nullable(); + Map(x => x.CalculatedCalibFactor).Not.Nullable(); + + Map(x => x.Stored).Not.Nullable(); + + Map(x => x.ErrorStr) + .Length(240) + .Nullable(); + + Map(x => x.TimeStart).Not.Nullable(); + Map(x => x.TimeEnd).Not.Nullable(); + + Map(x => x.CalibRawStart).Not.Nullable(); + Map(x => x.CalibRawEnd).Not.Nullable(); + + Map(x => x.Error).Not.Nullable(); + + Map(x => x.VolumeStart).Not.Nullable(); + Map(x => x.VolumeEnd).Not.Nullable(); + + + } + } +} diff --git a/Results/Mappings/WaterMeterDataMap.cs b/Results/Mappings/WaterMeterDataMap.cs index 35b703458..12fb1e1cc 100644 --- a/Results/Mappings/WaterMeterDataMap.cs +++ b/Results/Mappings/WaterMeterDataMap.cs @@ -58,6 +58,8 @@ namespace Results.Mappings #if ORACLE_DB Map(x => x.WMTypeId); #endif - } + Map(x => x.Q3Channel); + + } } } diff --git a/Results/Mappings/WaterMeterMap.cs b/Results/Mappings/WaterMeterMap.cs index f6719ada9..3e0d6ca18 100644 --- a/Results/Mappings/WaterMeterMap.cs +++ b/Results/Mappings/WaterMeterMap.cs @@ -66,6 +66,7 @@ namespace Results.Mappings Map(x => x.Pruefindex); Map(x => x.HydrPruefung); #endif + Map(x => x.Q3Channel);// Genesis meter identification References(x => x.WaterMeterData); References(x => x.Batch); HasMany(x => x.MeterTestRslts) diff --git a/Results/Results.csproj b/Results/Results.csproj index 3376f1e96..9e31754b3 100644 --- a/Results/Results.csproj +++ b/Results/Results.csproj @@ -281,4 +281,11 @@ + + + + + + + \ No newline at end of file diff --git a/TBF/Rig/RegisterReaders/GenesisRegReader/GenesisCfg.cs b/TBF/Rig/RegisterReaders/GenesisRegReader/GenesisCfg.cs index 535bed0ae..30a93dc01 100644 --- a/TBF/Rig/RegisterReaders/GenesisRegReader/GenesisCfg.cs +++ b/TBF/Rig/RegisterReaders/GenesisRegReader/GenesisCfg.cs @@ -26,7 +26,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader public int HeadCommunicationComPortNr; public int OptoComPortNr; public int RfidComPortNr; /// 0 = use MuxBoardNr - public int MuxBoardNr; /// 0 = use RfidComPort(Nr), otherwise mux. board nr. 1 .. 4 + public int MuxBoardNr; /// 0 = use RfidComPort(Nr), otherwise mux. board nr. 1 .. 4 in new 1 .. 10 - paralel genesis access public int Group; /// Number written to QuidoRS to connct the watermeter to RfidComPort, 1 .. 10 //public CommunicationInterface CommunicationInterface; /// Communication Interface: RFID or NFC public string CommunicationInterfaceBridge; /// Communication Interface: RFID or NFC diff --git a/TBF/Rig/RegisterReaders/GenesisRegReader/GenesisCfgCtrl.cs b/TBF/Rig/RegisterReaders/GenesisRegReader/GenesisCfgCtrl.cs index ecb358ca6..bc4678c8b 100644 --- a/TBF/Rig/RegisterReaders/GenesisRegReader/GenesisCfgCtrl.cs +++ b/TBF/Rig/RegisterReaders/GenesisRegReader/GenesisCfgCtrl.cs @@ -157,7 +157,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader message += Environment.NewLine + "'Head communication serial port nr.' is not valid"; } - if (!int.TryParse(muxBoardNrTextBox.Text, out dummy) || dummy < 1 || dummy > 4) + if (!int.TryParse(muxBoardNrTextBox.Text, out dummy) || dummy < 1 || dummy > 10) { flags |= CfgUpdateFlags.Error; message += Environment.NewLine + string.Format(Strings.Invalid_0, muxBoardNrLabel.Text); diff --git a/TBF/Rig/RegisterReaders/GenesisRegReader/GenesisCfgCtrl.designer.cs b/TBF/Rig/RegisterReaders/GenesisRegReader/GenesisCfgCtrl.designer.cs index 9ae5fa75c..cd872c22b 100644 --- a/TBF/Rig/RegisterReaders/GenesisRegReader/GenesisCfgCtrl.designer.cs +++ b/TBF/Rig/RegisterReaders/GenesisRegReader/GenesisCfgCtrl.designer.cs @@ -76,11 +76,11 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader // this.tabControl1.Controls.Add(this.tabPage1); this.tabControl1.Controls.Add(this.tabPage2); - this.tabControl1.Location = new System.Drawing.Point(3, 4); - this.tabControl1.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + this.tabControl1.Location = new System.Drawing.Point(2, 3); + this.tabControl1.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3); this.tabControl1.Name = "tabControl1"; this.tabControl1.SelectedIndex = 0; - this.tabControl1.Size = new System.Drawing.Size(687, 540); + this.tabControl1.Size = new System.Drawing.Size(458, 351); this.tabControl1.TabIndex = 0; // // tabPage1 @@ -99,40 +99,42 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader this.tabPage1.Controls.Add(this.nameTextBox); this.tabPage1.Controls.Add(this.nameLabel); this.tabPage1.Controls.Add(this.classNameLabel); - this.tabPage1.Location = new System.Drawing.Point(4, 29); - this.tabPage1.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + this.tabPage1.Location = new System.Drawing.Point(4, 22); + this.tabPage1.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3); this.tabPage1.Name = "tabPage1"; - this.tabPage1.Padding = new System.Windows.Forms.Padding(3, 4, 3, 4); - this.tabPage1.Size = new System.Drawing.Size(679, 507); + this.tabPage1.Padding = new System.Windows.Forms.Padding(2, 3, 2, 3); + this.tabPage1.Size = new System.Drawing.Size(450, 325); this.tabPage1.TabIndex = 0; this.tabPage1.Text = "Config"; this.tabPage1.UseVisualStyleBackColor = true; // // label5 // - this.label5.Location = new System.Drawing.Point(372, 55); + this.label5.Location = new System.Drawing.Point(248, 36); + this.label5.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(100, 23); + this.label5.Size = new System.Drawing.Size(67, 15); this.label5.TabIndex = 28; this.label5.Text = "Slot Nr:"; // // textBoxSlotNr // this.textBoxSlotNr.Enabled = false; - this.textBoxSlotNr.Location = new System.Drawing.Point(480, 55); + this.textBoxSlotNr.Location = new System.Drawing.Point(320, 36); + this.textBoxSlotNr.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.textBoxSlotNr.Name = "textBoxSlotNr"; - this.textBoxSlotNr.Size = new System.Drawing.Size(74, 26); + this.textBoxSlotNr.Size = new System.Drawing.Size(51, 20); this.textBoxSlotNr.TabIndex = 27; // // groupBox2 // this.groupBox2.Controls.Add(this.headPortNrTextBox); this.groupBox2.Controls.Add(this.label2); - this.groupBox2.Location = new System.Drawing.Point(11, 450); - this.groupBox2.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + this.groupBox2.Location = new System.Drawing.Point(7, 292); + this.groupBox2.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3); this.groupBox2.Name = "groupBox2"; - this.groupBox2.Padding = new System.Windows.Forms.Padding(3, 4, 3, 4); - this.groupBox2.Size = new System.Drawing.Size(621, 52); + this.groupBox2.Padding = new System.Windows.Forms.Padding(2, 3, 2, 3); + this.groupBox2.Size = new System.Drawing.Size(414, 34); this.groupBox2.TabIndex = 26; this.groupBox2.TabStop = false; this.groupBox2.Text = "Head Communication"; @@ -140,41 +142,37 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader // headPortNrTextBox // this.headPortNrTextBox.Enabled = false; - this.headPortNrTextBox.Location = new System.Drawing.Point(494, 19); - this.headPortNrTextBox.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.headPortNrTextBox.Location = new System.Drawing.Point(329, 12); this.headPortNrTextBox.Name = "headPortNrTextBox"; - this.headPortNrTextBox.Size = new System.Drawing.Size(49, 26); + this.headPortNrTextBox.Size = new System.Drawing.Size(34, 20); this.headPortNrTextBox.TabIndex = 8; // // label2 // this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(361, 22); - this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label2.Location = new System.Drawing.Point(241, 14); this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(107, 20); + this.label2.Size = new System.Drawing.Size(72, 13); this.label2.TabIndex = 7; this.label2.Text = "Serial port nr.:"; // // label4 // this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(234, 126); - this.label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label4.Location = new System.Drawing.Point(156, 82); this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(52, 20); + this.label4.Size = new System.Drawing.Size(37, 13); this.label4.TabIndex = 25; this.label4.Text = "1 .. 10"; // // label3 // this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(234, 90); - this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label3.Location = new System.Drawing.Point(156, 58); this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(43, 20); + this.label3.Size = new System.Drawing.Size(37, 13); this.label3.TabIndex = 24; - this.label3.Text = "1 .. 4"; + this.label3.Text = "1 .. 10"; // // groupBox1 // @@ -182,11 +180,9 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader this.groupBox1.Controls.Add(this.label1); this.groupBox1.Controls.Add(this.rfidPortNrTextBox); this.groupBox1.Controls.Add(this.rfidSerialPortNrLabel); - this.groupBox1.Location = new System.Drawing.Point(11, 363); - this.groupBox1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.groupBox1.Location = new System.Drawing.Point(7, 236); this.groupBox1.Name = "groupBox1"; - this.groupBox1.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5); - this.groupBox1.Size = new System.Drawing.Size(621, 85); + this.groupBox1.Size = new System.Drawing.Size(414, 55); this.groupBox1.TabIndex = 23; this.groupBox1.TabStop = false; this.groupBox1.Text = "RFID / NFC communication (in case mux. board is not used)"; @@ -195,38 +191,35 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader // this.comboBoxCommunicationInterface.Enabled = false; this.comboBoxCommunicationInterface.FormattingEnabled = true; - this.comboBoxCommunicationInterface.Location = new System.Drawing.Point(202, 34); - this.comboBoxCommunicationInterface.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + this.comboBoxCommunicationInterface.Location = new System.Drawing.Point(135, 22); + this.comboBoxCommunicationInterface.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3); this.comboBoxCommunicationInterface.Name = "comboBoxCommunicationInterface"; - this.comboBoxCommunicationInterface.Size = new System.Drawing.Size(152, 28); + this.comboBoxCommunicationInterface.Size = new System.Drawing.Size(103, 21); this.comboBoxCommunicationInterface.TabIndex = 9; // // label1 // this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(8, 38); - this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label1.Location = new System.Drawing.Point(5, 25); this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(187, 20); + this.label1.Size = new System.Drawing.Size(124, 13); this.label1.TabIndex = 8; this.label1.Text = "Communication Interface"; // // rfidPortNrTextBox // this.rfidPortNrTextBox.Enabled = false; - this.rfidPortNrTextBox.Location = new System.Drawing.Point(494, 32); - this.rfidPortNrTextBox.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.rfidPortNrTextBox.Location = new System.Drawing.Point(329, 21); this.rfidPortNrTextBox.Name = "rfidPortNrTextBox"; - this.rfidPortNrTextBox.Size = new System.Drawing.Size(49, 26); + this.rfidPortNrTextBox.Size = new System.Drawing.Size(34, 20); this.rfidPortNrTextBox.TabIndex = 7; // // rfidSerialPortNrLabel // this.rfidSerialPortNrLabel.AutoSize = true; - this.rfidSerialPortNrLabel.Location = new System.Drawing.Point(361, 38); - this.rfidSerialPortNrLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.rfidSerialPortNrLabel.Location = new System.Drawing.Point(241, 25); this.rfidSerialPortNrLabel.Name = "rfidSerialPortNrLabel"; - this.rfidSerialPortNrLabel.Size = new System.Drawing.Size(107, 20); + this.rfidSerialPortNrLabel.Size = new System.Drawing.Size(72, 13); this.rfidSerialPortNrLabel.TabIndex = 6; this.rfidSerialPortNrLabel.Text = "Serial port nr.:"; // @@ -243,11 +236,9 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader this.optoDataGroupBox.Controls.Add(this.radioButton2); this.optoDataGroupBox.Controls.Add(this.optoSerialPortLabel); this.optoDataGroupBox.Controls.Add(this.optoSerialPortTextBox); - this.optoDataGroupBox.Location = new System.Drawing.Point(11, 164); - this.optoDataGroupBox.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.optoDataGroupBox.Location = new System.Drawing.Point(7, 107); this.optoDataGroupBox.Name = "optoDataGroupBox"; - this.optoDataGroupBox.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5); - this.optoDataGroupBox.Size = new System.Drawing.Size(621, 189); + this.optoDataGroupBox.Size = new System.Drawing.Size(414, 123); this.optoDataGroupBox.TabIndex = 18; this.optoDataGroupBox.TabStop = false; this.optoDataGroupBox.Text = "Opto-data"; @@ -257,9 +248,10 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader this.checkBox_EnableShowChanels.Checked = true; this.checkBox_EnableShowChanels.CheckState = System.Windows.Forms.CheckState.Checked; this.checkBox_EnableShowChanels.Enabled = false; - this.checkBox_EnableShowChanels.Location = new System.Drawing.Point(351, 147); + this.checkBox_EnableShowChanels.Location = new System.Drawing.Point(234, 96); + this.checkBox_EnableShowChanels.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.checkBox_EnableShowChanels.Name = "checkBox_EnableShowChanels"; - this.checkBox_EnableShowChanels.Size = new System.Drawing.Size(238, 24); + this.checkBox_EnableShowChanels.Size = new System.Drawing.Size(159, 16); this.checkBox_EnableShowChanels.TabIndex = 10; this.checkBox_EnableShowChanels.Text = "Enable Show Channels"; this.checkBox_EnableShowChanels.UseVisualStyleBackColor = true; @@ -267,58 +259,56 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader // tBBeginDataFlush // this.tBBeginDataFlush.Enabled = false; - this.tBBeginDataFlush.Location = new System.Drawing.Point(474, 105); + this.tBBeginDataFlush.Location = new System.Drawing.Point(316, 68); + this.tBBeginDataFlush.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.tBBeginDataFlush.MaxLength = 8; this.tBBeginDataFlush.Name = "tBBeginDataFlush"; - this.tBBeginDataFlush.Size = new System.Drawing.Size(69, 26); + this.tBBeginDataFlush.Size = new System.Drawing.Size(47, 20); this.tBBeginDataFlush.TabIndex = 9; this.tBBeginDataFlush.Text = "2000"; this.tBBeginDataFlush.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; // // labelFlush // - this.labelFlush.Location = new System.Drawing.Point(328, 109); + this.labelFlush.Location = new System.Drawing.Point(219, 71); + this.labelFlush.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.labelFlush.Name = "labelFlush"; - this.labelFlush.Size = new System.Drawing.Size(140, 22); + this.labelFlush.Size = new System.Drawing.Size(93, 14); this.labelFlush.TabIndex = 8; this.labelFlush.Text = "Begin Data Flush:"; // // tcpipPortLabel // this.tcpipPortLabel.AutoSize = true; - this.tcpipPortLabel.Location = new System.Drawing.Point(46, 109); - this.tcpipPortLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.tcpipPortLabel.Location = new System.Drawing.Point(31, 71); this.tcpipPortLabel.Name = "tcpipPortLabel"; - this.tcpipPortLabel.Size = new System.Drawing.Size(68, 20); + this.tcpipPortLabel.Size = new System.Drawing.Size(47, 13); this.tcpipPortLabel.TabIndex = 4; this.tcpipPortLabel.Text = "Port nr..:"; // // tcpipPortTextBox // this.tcpipPortTextBox.Enabled = false; - this.tcpipPortTextBox.Location = new System.Drawing.Point(161, 105); - this.tcpipPortTextBox.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.tcpipPortTextBox.Location = new System.Drawing.Point(107, 68); this.tcpipPortTextBox.Name = "tcpipPortTextBox"; - this.tcpipPortTextBox.Size = new System.Drawing.Size(57, 26); + this.tcpipPortTextBox.Size = new System.Drawing.Size(39, 20); this.tcpipPortTextBox.TabIndex = 5; // // ipAddressLabel // this.ipAddressLabel.AutoSize = true; - this.ipAddressLabel.Location = new System.Drawing.Point(46, 74); - this.ipAddressLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.ipAddressLabel.Location = new System.Drawing.Point(31, 48); this.ipAddressLabel.Name = "ipAddressLabel"; - this.ipAddressLabel.Size = new System.Drawing.Size(93, 20); + this.ipAddressLabel.Size = new System.Drawing.Size(63, 13); this.ipAddressLabel.TabIndex = 2; this.ipAddressLabel.Text = "IP address.:"; // // ipAddressTextBox // this.ipAddressTextBox.Enabled = false; - this.ipAddressTextBox.Location = new System.Drawing.Point(161, 69); - this.ipAddressTextBox.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.ipAddressTextBox.Location = new System.Drawing.Point(107, 45); this.ipAddressTextBox.Name = "ipAddressTextBox"; - this.ipAddressTextBox.Size = new System.Drawing.Size(145, 26); + this.ipAddressTextBox.Size = new System.Drawing.Size(98, 20); this.ipAddressTextBox.TabIndex = 3; // // radioButton1 @@ -326,10 +316,9 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader this.radioButton1.AutoSize = true; this.radioButton1.Checked = true; this.radioButton1.Enabled = false; - this.radioButton1.Location = new System.Drawing.Point(33, 29); - this.radioButton1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.radioButton1.Location = new System.Drawing.Point(22, 19); this.radioButton1.Name = "radioButton1"; - this.radioButton1.Size = new System.Drawing.Size(109, 24); + this.radioButton1.Size = new System.Drawing.Size(83, 17); this.radioButton1.TabIndex = 0; this.radioButton1.TabStop = true; this.radioButton1.Text = "Use TCP/IP"; @@ -339,10 +328,9 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader // this.radioButton2.AutoSize = true; this.radioButton2.Enabled = false; - this.radioButton2.Location = new System.Drawing.Point(351, 29); - this.radioButton2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.radioButton2.Location = new System.Drawing.Point(234, 19); this.radioButton2.Name = "radioButton2"; - this.radioButton2.Size = new System.Drawing.Size(129, 24); + this.radioButton2.Size = new System.Drawing.Size(92, 17); this.radioButton2.TabIndex = 1; this.radioButton2.Text = "Use serial port"; this.radioButton2.UseVisualStyleBackColor = true; @@ -350,108 +338,98 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader // optoSerialPortLabel // this.optoSerialPortLabel.AutoSize = true; - this.optoSerialPortLabel.Location = new System.Drawing.Point(361, 69); - this.optoSerialPortLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.optoSerialPortLabel.Location = new System.Drawing.Point(241, 45); this.optoSerialPortLabel.Name = "optoSerialPortLabel"; - this.optoSerialPortLabel.Size = new System.Drawing.Size(107, 20); + this.optoSerialPortLabel.Size = new System.Drawing.Size(72, 13); this.optoSerialPortLabel.TabIndex = 6; this.optoSerialPortLabel.Text = "Serial port nr.:"; // // optoSerialPortTextBox // this.optoSerialPortTextBox.Enabled = false; - this.optoSerialPortTextBox.Location = new System.Drawing.Point(494, 65); - this.optoSerialPortTextBox.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.optoSerialPortTextBox.Location = new System.Drawing.Point(329, 42); this.optoSerialPortTextBox.Name = "optoSerialPortTextBox"; - this.optoSerialPortTextBox.Size = new System.Drawing.Size(49, 26); + this.optoSerialPortTextBox.Size = new System.Drawing.Size(34, 20); this.optoSerialPortTextBox.TabIndex = 7; // // groupTextBox // this.groupTextBox.Enabled = false; - this.groupTextBox.Location = new System.Drawing.Point(172, 121); - this.groupTextBox.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.groupTextBox.Location = new System.Drawing.Point(115, 79); this.groupTextBox.Name = "groupTextBox"; - this.groupTextBox.Size = new System.Drawing.Size(49, 26); + this.groupTextBox.Size = new System.Drawing.Size(34, 20); this.groupTextBox.TabIndex = 22; // // groupLabel // this.groupLabel.AutoSize = true; - this.groupLabel.Location = new System.Drawing.Point(7, 126); - this.groupLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.groupLabel.Location = new System.Drawing.Point(5, 82); this.groupLabel.Name = "groupLabel"; - this.groupLabel.Size = new System.Drawing.Size(67, 20); + this.groupLabel.Size = new System.Drawing.Size(45, 13); this.groupLabel.TabIndex = 21; this.groupLabel.Text = "Group 2"; // // muxBoardNrTextBox // this.muxBoardNrTextBox.Enabled = false; - this.muxBoardNrTextBox.Location = new System.Drawing.Point(172, 86); - this.muxBoardNrTextBox.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.muxBoardNrTextBox.Location = new System.Drawing.Point(115, 56); this.muxBoardNrTextBox.Name = "muxBoardNrTextBox"; - this.muxBoardNrTextBox.Size = new System.Drawing.Size(49, 26); + this.muxBoardNrTextBox.Size = new System.Drawing.Size(34, 20); this.muxBoardNrTextBox.TabIndex = 20; // // muxBoardNrLabel // this.muxBoardNrLabel.AutoSize = true; - this.muxBoardNrLabel.Location = new System.Drawing.Point(7, 90); - this.muxBoardNrLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.muxBoardNrLabel.Location = new System.Drawing.Point(5, 58); this.muxBoardNrLabel.Name = "muxBoardNrLabel"; - this.muxBoardNrLabel.Size = new System.Drawing.Size(159, 20); + this.muxBoardNrLabel.Size = new System.Drawing.Size(106, 13); this.muxBoardNrLabel.TabIndex = 19; this.muxBoardNrLabel.Text = "Group 1 (mux. board)"; // // nameTextBox // this.nameTextBox.Enabled = false; - this.nameTextBox.Location = new System.Drawing.Point(172, 50); - this.nameTextBox.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.nameTextBox.Location = new System.Drawing.Point(115, 32); this.nameTextBox.Name = "nameTextBox"; - this.nameTextBox.Size = new System.Drawing.Size(180, 26); + this.nameTextBox.Size = new System.Drawing.Size(121, 20); this.nameTextBox.TabIndex = 17; // // nameLabel // this.nameLabel.AutoSize = true; - this.nameLabel.Location = new System.Drawing.Point(7, 55); - this.nameLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.nameLabel.Location = new System.Drawing.Point(5, 36); this.nameLabel.Name = "nameLabel"; - this.nameLabel.Size = new System.Drawing.Size(51, 20); + this.nameLabel.Size = new System.Drawing.Size(35, 13); this.nameLabel.TabIndex = 16; this.nameLabel.Text = "Name"; // // classNameLabel // this.classNameLabel.AutoSize = true; - this.classNameLabel.Location = new System.Drawing.Point(168, 14); - this.classNameLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.classNameLabel.Location = new System.Drawing.Point(112, 9); this.classNameLabel.Name = "classNameLabel"; - this.classNameLabel.Size = new System.Drawing.Size(90, 20); + this.classNameLabel.Size = new System.Drawing.Size(60, 13); this.classNameLabel.TabIndex = 15; this.classNameLabel.Text = "ClassName"; // // tabPage2 // - this.tabPage2.Location = new System.Drawing.Point(4, 29); - this.tabPage2.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + this.tabPage2.Location = new System.Drawing.Point(4, 22); + this.tabPage2.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3); this.tabPage2.Name = "tabPage2"; - this.tabPage2.Padding = new System.Windows.Forms.Padding(3, 4, 3, 4); - this.tabPage2.Size = new System.Drawing.Size(679, 507); + this.tabPage2.Padding = new System.Windows.Forms.Padding(2, 3, 2, 3); + this.tabPage2.Size = new System.Drawing.Size(450, 325); this.tabPage2.TabIndex = 1; this.tabPage2.Text = "Test"; this.tabPage2.UseVisualStyleBackColor = true; // // GenesisCfgCtrl // - this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F); + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.Controls.Add(this.tabControl1); - this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.Name = "GenesisCfgCtrl"; - this.Size = new System.Drawing.Size(694, 548); + this.Size = new System.Drawing.Size(463, 356); this.Load += new System.EventHandler(this.WaterMeterCfgCtrl_Load); this.tabControl1.ResumeLayout(false); this.tabPage1.ResumeLayout(false); diff --git a/TBF/Rig/RegisterReaders/GenesisRegReader/communication/GciBridgeClient.cs b/TBF/Rig/RegisterReaders/GenesisRegReader/communication/GciBridgeClient.cs new file mode 100644 index 000000000..291f3d3f2 --- /dev/null +++ b/TBF/Rig/RegisterReaders/GenesisRegReader/communication/GciBridgeClient.cs @@ -0,0 +1,49 @@ +using System.Threading; +using System.Threading.Tasks; +using GenesisCordonelInterface.API; +using GenesisCordonelInterface.Core.Threading; +using TBF.Rig.BridgeComponents.GciBridge; + + +namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication +{ + public class GciBridgeClient : IGciBridgeClient + { + private readonly GciBridge bridge; + + public GciBridgeClient(GciBridge bridge) + { + this.bridge = bridge; + } + + public Task> + ReadRegisterWithRetryAsync( + int slotId, + string registerName, + CancellationToken token = default) + { + return bridge.ReadRegisterWithRetryAsync( + slotId, + registerName, + token); + } + + public Task> + WriteRegisterWithRetryAsync( + int slotId, + string registerName, + ushort value, + bool verify, + bool throwOnError, + CancellationToken token = default) + { + return bridge.WriteRegisterWithRetryAsync( + slotId, + registerName, + value, + verify, + throwOnError, + token); + } + } +} diff --git a/TBF/Rig/RegisterReaders/GenesisRegReader/communication/IGciBridgeClient.cs b/TBF/Rig/RegisterReaders/GenesisRegReader/communication/IGciBridgeClient.cs new file mode 100644 index 000000000..11d517be1 --- /dev/null +++ b/TBF/Rig/RegisterReaders/GenesisRegReader/communication/IGciBridgeClient.cs @@ -0,0 +1,25 @@ +using System.Threading; +using System.Threading.Tasks; +using GenesisCordonelInterface.API; +using GenesisCordonelInterface.Core.Threading; + +namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication +{ + public interface IGciBridgeClient + { + Task> + ReadRegisterWithRetryAsync( + int slotId, + string registerName, + CancellationToken token = default); + + Task> + WriteRegisterWithRetryAsync( + int slotId, + string registerName, + ushort value, + bool verify, + bool throwOnError, + CancellationToken token = default); + } +} diff --git a/TBF/Rig/RegisterReaders/GenesisRegReader/communication/OptoHeadTest.cs b/TBF/Rig/RegisterReaders/GenesisRegReader/communication/OptoHeadTest.cs index 7b2de0854..4665222bd 100644 --- a/TBF/Rig/RegisterReaders/GenesisRegReader/communication/OptoHeadTest.cs +++ b/TBF/Rig/RegisterReaders/GenesisRegReader/communication/OptoHeadTest.cs @@ -1,15 +1,46 @@ using System; +using System.Collections.Generic; +using System.Threading; using System.Threading.Tasks; using Common; +using Config.Entities; +using CordonelPreadjustmentUi.Processes.Itinerary; using GenesisCordonelInterface.API; using log4net; +using Results.Entities; +using Results.Entities.helpers; using TBF.Rig.BridgeComponents.GciBridge; +using TBF.Rig.RegisterReaders.GenesisRegReader.communication.common; using TBF.Rig.RegisterReaders.GenesisRegReader.implementations; +using TBF.Rig.Sequences; +using TBF.Rig.TestMethods.GenesisCommunication; using TBF.Rig.TestMethods.iPerlCommunication.communication.C4.diagnosticLed; +using Xylem.Common.Ui.CordonelPreadjustmentUi; namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication { + public class PcbReadResult + { + public bool Success { get; set; } + public string? PcbId { get; set; } + public string? ErrorMessage { get; set; } + + public static PcbReadResult Ok(string pcbId) => + new PcbReadResult + { + Success = true, + PcbId = pcbId + }; + + public static PcbReadResult Fail(string error) => + new PcbReadResult + { + Success = false, + ErrorMessage = error + }; + } + public class OptoHeadTest : IDisposable { //protected static readonly ILog rfidDataLogger = LogManager.GetLogger("RfidData"); @@ -18,93 +49,516 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication private GenesisSmartReader genesisHead; //private SerialDriver serialDriver; - public void BuildConnection(GenesisSmartReader genesidHead) + public static string ResultOk = "OK"; + public static string ResultNok = "NOK"; + + + public async Task BuildConnection(GenesisSmartReader genesidHead) { - //TODO BUMI make fix rebuild - PublicModels.GciInitSlotRequest request = new PublicModels.GciInitSlotRequest + await BuildConnectionAsync(genesidHead).ConfigureAwait(false); + } + + public async Task BuildConnectionAsync(GenesisSmartReader genesidHead) + { + if (genesidHead == null) + throw new ArgumentNullException(nameof(genesidHead)); + + bool simulation = genesidHead.DebugLevel == DebugMode.Simulate; + + //No simulation + var bridge = genesidHead.CommInterfaceBridge; + if (bridge == null) + throw new InvalidOperationException($"CommInterfaceBridge is null. Head: {genesidHead.GetSlotNr}"); + + //Check if exist and connected + PublicModels.GciSlotInfo gciSlotInfo = await bridge.GetSlotAsync(genesidHead.GetSlotNr); + + if (gciSlotInfo == null && gciSlotInfo.IsConnected) + { + log.Debug($"BuildConnection() - SlotNr: {genesidHead.GetSlotNr} already exist and connected!"); + return; + } + + //Unconnected - do connection + var request = new PublicModels.GciInitSlotRequest { SlotId = genesidHead.GetSlotNr, ConfigSource = PublicModels.GciConfigSource.InterfaceInputConfig, PasswordSource = PublicModels.GciPasswordSource.InterfaceInputPassword, - RequestPort = new PublicModels.GciPortConfig{ PortName = $"COM{genesidHead.RfidComPortNr}", Type = PublicModels.MapPortType("IRDA")}, - StreamingPort = new PublicModels.GciPortConfig{ PortName = $"COM{genesidHead.OptoComPortNr}", Type = string.Empty} + + RequestPort = new PublicModels.GciPortConfig + { + PortName = $"COM{genesidHead.RfidComPortNr}", + Type = simulation ? "SIMULATE" : PublicModels.MapPortType("IRDA") + }, + + StreamingPort = new PublicModels.GciPortConfig + { + PortName = "NA", //$"COM{genesidHead.OptoComPortNr}", + Type = simulation ? "SIMULATE" : string.Empty + } }; - genesidHead?.CommInterfaceBridge.InitSlotAsync(request); - genesidHead?.CommInterfaceBridge?.UpdateSlotAsync(request); + + log.Debug($"BuildConnection() - SlotNr: {genesidHead.GetSlotNr} initializing... Request: {request}"); + + + + var initResult = await ExecuteWithRetryAsync( + () => bridge.InitSlotAsync(request), + r => r.Success, + $"InitSlotAsync({genesidHead.GetSlotNr})"); + + + log.Debug($"BuildConnection() - SlotNr: {genesidHead.GetSlotNr} initialized. Result: {initResult}"); + + if (initResult == null) + throw new InvalidOperationException("InitSlotAsync returned null."); + + var updateResult = await ExecuteWithRetryAsync( + () => bridge.UpdateSlotAsync(request), + r => r.Success, + $"UpdateSlotAsync({genesidHead.GetSlotNr})"); + + log.Debug($"BuildConnection() - SlotNr: {genesidHead.GetSlotNr} updated! Result: {updateResult}"); + + if (updateResult == null) + throw new InvalidOperationException("UpdateSlotAsync returned null."); + slotDefined = true; } - + + public async Task InitialiseBuild_Async(GenesisSmartReader genesidHead) + { + if (genesidHead == null) + throw new ArgumentNullException(nameof(genesidHead)); + + bool simulation = genesidHead.DebugLevel == DebugMode.Simulate; + + //No simulation + var bridge = genesidHead.CommInterfaceBridge; + if (bridge == null) + throw new InvalidOperationException($"CommInterfaceBridge is null. Head: {genesidHead.GetSlotNr}"); + + //Check if exist and connected + PublicModels.GciSlotInfo gciSlotInfo = await bridge.GetSlotAsync(genesidHead.GetSlotNr); + + if (gciSlotInfo == null) + { + log.Debug($"InitialiseBuild_Async() - SlotNr: {genesidHead.GetSlotNr} already exist and connected!"); + return true; + } + + //Unconnected - do connection + var request = new PublicModels.GciInitSlotRequest + { + SlotId = genesidHead.GetSlotNr, + ConfigSource = PublicModels.GciConfigSource.InterfaceInputConfig, + PasswordSource = PublicModels.GciPasswordSource.InterfaceInputPassword, + + RequestPort = new PublicModels.GciPortConfig + { + PortName = $"COM{genesidHead.RfidComPortNr}", + Type = simulation ? "SIMULATE" : PublicModels.MapPortType("IRDA") + }, + + StreamingPort = new PublicModels.GciPortConfig + { + PortName = "NA", //$"COM{genesidHead.OptoComPortNr}", + Type = simulation ? "SIMULATE" : string.Empty + } + }; + + log.Debug($"InitialiseBuild_Async() - SlotNr: {genesidHead.GetSlotNr} initializing... Request: {request}"); + var initResult = await ExecuteWithRetryAsync( + () => bridge.InitSlotAsync(request), + r => r.Success, + $"InitSlotAsync({genesidHead.GetSlotNr})"); + log.Debug($"InitialiseBuild_Async() - SlotNr: {genesidHead.GetSlotNr} initialized. Result: {initResult}"); + return initResult.Success; + } + + public async Task UpdateBuild_Async(GenesisSmartReader genesidHead) + { + if (genesidHead == null) + throw new ArgumentNullException(nameof(genesidHead)); + + bool simulation = genesidHead.DebugLevel == DebugMode.Simulate; + + //No simulation + var bridge = genesidHead.CommInterfaceBridge; + if (bridge == null) + throw new InvalidOperationException($"UpdateBuild_Async CommInterfaceBridge is null. Head: {genesidHead.GetSlotNr}"); + + //Check if exist - must step before + PublicModels.GciSlotInfo gciSlotInfo = await bridge.GetSlotAsync(genesidHead.GetSlotNr); + + if (gciSlotInfo == null) + { + log.Debug($"UpdateBuild_Async() - SlotNr: {genesidHead.GetSlotNr} INIT missing! - must be initialised first!"); + return false; + } + + //Unconnected - do connection + var request = new PublicModels.GciInitSlotRequest + { + SlotId = genesidHead.GetSlotNr, + ConfigSource = PublicModels.GciConfigSource.InterfaceInputConfig, + PasswordSource = PublicModels.GciPasswordSource.InterfaceInputPassword, + + RequestPort = new PublicModels.GciPortConfig + { + PortName = $"COM{genesidHead.RfidComPortNr}", + Type = simulation ? "SIMULATE" : PublicModels.MapPortType("IRDA") + }, + + StreamingPort = new PublicModels.GciPortConfig + { + PortName = "NA", //$"COM{genesidHead.OptoComPortNr}", + Type = simulation ? "SIMULATE" : string.Empty + } + }; + + log.Debug($"UpdateBuild_Async() - SlotNr: {genesidHead.GetSlotNr} updating... Request: {request}"); + var updateResult = await ExecuteWithRetryAsync( + () => bridge.UpdateSlotAsync(request), + r => r.Success, + $"UpdateSlotAsync({genesidHead.GetSlotNr})"); + log.Debug($"UpdateBuild_Async() - SlotNr: {genesidHead.GetSlotNr} updated. Result: {updateResult}"); + return updateResult.Success; + } + + private async Task ExecuteWithRetryAsync( + Func> action, + Func successCondition, + string operationName, + int maxRetries = 5, + int timeoutSeconds = 30, + int delayMs = 1000) + { + using var cts = new CancellationTokenSource( TimeSpan.FromSeconds(timeoutSeconds)); + + Exception lastException = null; + + for (int attempt = 1; attempt <= maxRetries; attempt++) + { + if (cts.IsCancellationRequested) + { + throw new TimeoutException( $"{operationName} timeout after {timeoutSeconds} seconds."); + } + + try + { + log.Debug($"{operationName} attempt {attempt}/{maxRetries}"); + + T result = await action(); + + if (result == null) + throw new InvalidOperationException( + $"{operationName} returned null."); + + if (successCondition(result)) + { + log.Debug($"{operationName} success."); + return result; + } + + log.Debug($"{operationName} failed. Success condition not met."); + } + catch (Exception ex) + { + lastException = ex; + log.Error($"{operationName} failed on attempt {attempt}/{maxRetries}", ex); + } + + await Task.Delay(delayMs, cts.Token); + } + + throw new InvalidOperationException( + $"{operationName} failed after {maxRetries} attempts.", + lastException); + } + + private static async Task WithTimeout( + Task task, + TimeSpan timeout, + string timeoutMessage) + { + var timeoutTask = Task.Delay(timeout); + + var completedTask = await Task.WhenAny(task, timeoutTask); + + if (completedTask == timeoutTask) + throw new TimeoutException(timeoutMessage); + + return await task; + } + public OptoHeadTest(GenesisSmartReader genesisHead) { this.genesisHead = genesisHead; } - + public void CloseConnection() { - genesisHead?.CommInterfaceBridge?.DisconnectAsync(genesisHead.GetSlotNr); + Task.Run(CloseConnectionAsync) + .GetAwaiter() + .GetResult(); + return; + } + + public async Task CloseConnectionAsync() + { + log.Debug("CloseConnectionAsync called for iHead: " + genesisHead); + await genesisHead?.CommInterfaceBridge?.DisconnectAsync(genesisHead.GetSlotNr)!; + log.Debug("DisconnectAsync completed for iHead: " + genesisHead); + await genesisHead?.CommInterfaceBridge?.CleanSlotAsync(genesisHead.GetSlotNr)!; + log.Debug("CleanSlotAsync completed for iHead: " + genesisHead); DisposeSlot(); // if (serialDriver != null) // serialDriver.CloseConnection(); // serialDriver = null; + return true; } + private bool isConnected = false; private bool slotDefined = false; public bool IsSlotDefined { get => slotDefined; } + public bool IsConnected { get => isConnected; } - - public void DisposeSlot() - { - slotDefined = false; - } - - public async Task ReadSerialNrAsync() + public void DisposeSlot() { slotDefined = false; isConnected = false; } + + public async Task ReadRequest_PCBAsync(GenesisSmartReader genesisHead) { try { + log.Debug("ReadRequest_PCBAsync called for iHead: " + genesisHead); + if (genesisHead == null) - return false; + return string.Empty; if (string.IsNullOrEmpty(genesisHead.CommInterface)) - return false; + return string.Empty; if (genesisHead.CommInterfaceBridge == null) - return false; + return string.Empty; - if (!IsSlotDefined) - BuildConnection(genesisHead); + + await BuildConnectionAsync(genesisHead); + + + if (genesisHead.DebugLevel == DebugMode.Simulate) + { + log.Debug($"ReadRequest_PCBAsync({genesisHead.GetSlotNr}) - Simulated response"); + return "-OK Simulated PCB-"; + } GciBridge gciBridge = genesisHead.CommInterfaceBridge; + log.Debug($"ReadRequest_PCBAsync({genesisHead.GetSlotNr}) - GciBridge created"); + gciBridge.GciBridgeCfg.EnableExternalAccess = true; gciBridge.GciBridgeCfg.EnableGuiAccess = false; + gciBridge.Initialize(); + log.Debug($"ReadRequest_PCBAsync({genesisHead.GetSlotNr}) - GciBridge initialized"); + RadioService headService = new RadioService(gciBridge); - string pcbId = await headService.ReadRequest_PCBAsync(genesisHead); - return !string.IsNullOrEmpty(pcbId); + ReadPcbResult pcbResult = await headService.ReadRequest_PCBAsync(genesisHead); + + if (pcbResult == null) + { + log.Info( $"PCB Number NOT found on COM{genesisHead.RfidComPortNr} SlotNr: {genesisHead.GetSlotNr}"); + return string.Empty; + } + + isConnected = pcbResult.IsConnected; + + string serialNo = pcbResult.PcbId; + log.Info( $"PCB Number: {serialNo} on COM{genesisHead.RfidComPortNr} SlotNr: {genesisHead.GetSlotNr}"); + + if (pcbResult.IsValidPcb) + { + log.Debug($"Setting PCB: {pcbResult.PcbId} for Head: {genesisHead.Name}"); + genesisHead.SerialNr = pcbResult.PcbId; + if (genesisHead.ConfigStruct != null) + { + genesisHead.ConfigStruct.PCBNumberString = pcbResult.PcbId; + } + log.Info( $"PCB STORED TO HEAD Number: {serialNo} on COM{genesisHead.RfidComPortNr} SlotNr: {genesisHead.GetSlotNr} is valid"); + } + + return serialNo; } catch (Exception ex) { - log.Error($"ReadSerialNr(COM{genesisHead?.RfidComPortNr}) - Exception: {ex}"); - return false; + log.Error($"ReadRequest_PCBAsync({genesisHead.GetSlotNr}) - Exception:", ex); + return ex.Message; } } public string ReadRequest_PCB() { - // if (genesisHead.DebugLevel == DebugMode.Simulate) - // { - // log.Debug("ReadRequest_PCB() - Simulated response"); - // return "-OK Simulated response-"; - // } + if (genesisHead != null && genesisHead.DebugLevel == DebugMode.Simulate) + { + log.Debug("ReadRequest_PCB() - Simulated response"); + return "Simulated PCB-123"; + } + return Task.Run(() => ReadRequest_PCBAsync(genesisHead)) + .GetAwaiter() + .GetResult(); + } + public string InitialiseSlot() + { + if (genesisHead != null && genesisHead.DebugLevel == DebugMode.Simulate) + { + log.Debug("Initialise() - Simulated response"); + return "Simulated Initialise"; + } + return Task.Run(() => Initialise_Async(genesisHead)) + .GetAwaiter() + .GetResult(); + } + + public string UpdateSlot() + { + if (genesisHead != null && genesisHead.DebugLevel == DebugMode.Simulate) + { + log.Debug("Update() - Simulated response"); + return "Simulated Update"; + } + return Task.Run(() => Update_Async(genesisHead)) + .GetAwaiter() + .GetResult(); + } + + + public string ConnectSlot() + { + if (genesisHead != null && genesisHead.DebugLevel == DebugMode.Simulate) + { + log.Debug("Connect() - Simulated response"); + return "Simulated Connect"; + } + return Task.Run(() => Connect_Async(genesisHead)) + .GetAwaiter() + .GetResult(); + } + + public PcbReadResult PCB_ReadSlot() + { + if (genesisHead != null && genesisHead.DebugLevel == DebugMode.Simulate) + { + log.Debug("PCB_Read() - Simulated response"); + genesisHead.SerialNr = $"PCB_Simul_{genesisHead.GetSlotNr}"; + if (genesisHead.ConfigStruct != null) + genesisHead.ConfigStruct.PCBNumberString = $"PCB_Simul_{genesisHead.GetSlotNr}"; + return PcbReadResult.Ok("Simulated PCB_Read"); + } + + return Task.Run(() => PCB_Read_Async(genesisHead)) + .GetAwaiter() + .GetResult(); + + } + + private async Task PCB_Read_Async(GenesisSmartReader genesisSmartReader) + { try { - log.Debug("ReadRequest_PCB called for iHead: " + genesisHead.ToString()); + log.Debug("PCB_Read_Async called for iHead: " + genesisHead); + if (genesisHead == null) return PcbReadResult.Fail("genesisHead is null."); + if (genesisHead.CommInterfaceBridge == null) return PcbReadResult.Fail("genesisHead is null.");; + + var pbcReadBuildAsync = await PBC_Read_Build_Async(genesisHead); + + if (pbcReadBuildAsync.Success && !string.IsNullOrEmpty(pbcReadBuildAsync.PcbId)) + { + log.Debug($"Setting PCB: {pbcReadBuildAsync.PcbId} for Head: {genesisHead.Name}"); + genesisHead.SerialNr = pbcReadBuildAsync.PcbId; + } + + return pbcReadBuildAsync; + } + catch (Exception ex) + { + log.Error($"PCB_Read_Async({genesisHead.GetSlotNr}) - Exception:", ex); + return PcbReadResult.Fail(ex.Message); + } + } + + private async Task PBC_Read_Build_Async( GenesisSmartReader genesisSmartReader) + { + log.Debug($"PBC_Read_Build_Async called for iHead: {genesisSmartReader}"); + var slotInfo = await genesisSmartReader.CommInterfaceBridge.GetSlotWithRetryAsync(genesisSmartReader.GetSlotNr); + if (slotInfo == null) + { + log.Debug($"PBC_Read_Build_Async({genesisSmartReader.GetSlotNr}) - SlotInfo is null."); + return PcbReadResult.Fail("SlotInfo is null."); + } + + if (!slotInfo.Success) + { + log.Debug($"PBC_Read_Build_Async({genesisSmartReader.GetSlotNr}) - SlotInfo failed."); + return PcbReadResult.Fail("SlotInfo failed."); + } + + if (!string.IsNullOrEmpty(slotInfo?.Result?.PcbId)) + { + log.Debug($"PBC_Read_Build_Async({genesisSmartReader.GetSlotNr}) - Slot already has PcbId."); + return PcbReadResult.Ok(slotInfo.Result.PcbId); + } + + log.Debug($"PBC_Read_Build_Async({genesisSmartReader.GetSlotNr}) - Connecting..."); + CancellationToken token = default; + //////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // PCB READ LOOP + try + { + string validPcbId = null; + int maxAttempts = 5; + + var pcbTask = genesisSmartReader.CommInterfaceBridge.GetPcbIdWithRetryAsync(genesisSmartReader.GetSlotNr); + + if (pcbTask?.Result?.Success == true) + { + validPcbId = pcbTask.Result.Result.PcbId; + } + + + if (string.IsNullOrEmpty(validPcbId)) + { + return PcbReadResult.Fail("Failed to read PCB ID."); + } + + if (genesisSmartReader.ConfigStruct != null) + { + genesisSmartReader.ConfigStruct.PCBNumberString = validPcbId; + } + genesisSmartReader.SerialNr = validPcbId; + log.Debug( $"PBC_Read_Build_Async({genesisSmartReader.GetSlotNr}) " + $"ValidPcbId:({validPcbId})"); + return PcbReadResult.Ok(validPcbId); + } + catch (Exception e) + { + log.Error($"PBC_Read_Build_Async({genesisSmartReader.GetSlotNr}) - Exception:", e); + return PcbReadResult.Fail(e.Message); + } + } + + + + public async Task Initialise_Async(GenesisSmartReader genesisHead) + { + try + { + log.Debug("Initialise_Async called for iHead: " + genesisHead); + if (genesisHead == null) return string.Empty; @@ -114,33 +568,98 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication if (genesisHead.CommInterfaceBridge == null) return string.Empty; - if (!IsSlotDefined) - { - BuildConnection(genesisHead); - } + var initialiseBuildAsync = await InitialiseBuild_Async(genesisHead); - GciBridge gciBridge = genesisHead.CommInterfaceBridge; - log.Debug("ReadRequest_PCB() - GciBridge created"); - - gciBridge.GciBridgeCfg.EnableExternalAccess = true; - gciBridge.GciBridgeCfg.EnableGuiAccess = false; - gciBridge.Initialize(); - log.Debug("ReadRequest_PCB() - GciBridge initialized"); - - - RadioService headService = new RadioService(gciBridge); - string serialNo = headService.ReadRequest_PCB(ref genesisHead); - log.Info( - $"PCB Number: {serialNo} on COM{genesisHead.RfidComPortNr} SlotNr: {genesisHead.GetSlotNr} serialDriver: {genesisHead?.CommInterfaceBridge}"); - return serialNo; + return initialiseBuildAsync ? "OK" : "NOK"; } catch (Exception ex) { - log.Error("ReadRequest_PCB() - Exception:" + ex.StackTrace); - return (ex.Message.ToString()); + log.Error($"Initialise_Async({genesisHead.GetSlotNr}) - Exception:", ex); + return ex.Message; } + + return "NOK"; } + public async Task Update_Async(GenesisSmartReader genesisHead) + { + try + { + log.Debug("Update_Async called for iHead: " + genesisHead); + + if (genesisHead == null) + return string.Empty; + + if (string.IsNullOrEmpty(genesisHead.CommInterface)) + return string.Empty; + + if (genesisHead.CommInterfaceBridge == null) + return string.Empty; + + bool updateBuildAsync = await UpdateBuild_Async(genesisHead); + + return updateBuildAsync ? "OK" : "NOK"; + } + catch (Exception ex) + { + log.Error($"UpdateBuild_Async({genesisHead.GetSlotNr}) - Exception:", ex); + return ex.Message; + } + + return "NOK"; + } + + public async Task Connect_Async(GenesisSmartReader genesisHead) + { + try + { + log.Debug("Initialise_Async called for iHead: " + genesisHead); + + if (genesisHead == null) + return string.Empty; + + if (string.IsNullOrEmpty(genesisHead.CommInterface)) + return string.Empty; + + if (genesisHead.CommInterfaceBridge == null) + return string.Empty; + + bool updateBuildAsync = await ConnectBuild_Async(genesisHead); + + return updateBuildAsync ? "OK" : "NOK"; + } + catch (Exception ex) + { + log.Error($"Initialise_Async({genesisHead.GetSlotNr}) - Exception:", ex); + return ex.Message; + } + + return "NOK"; + } + + private async Task ConnectBuild_Async(GenesisSmartReader genesisSmartReader) + { + log.Debug("ConnectBuild_Async called for iHead: " + genesisSmartReader); + var slotInfo = await genesisSmartReader.CommInterfaceBridge.GetSlotAsync(genesisSmartReader.GetSlotNr); + if (slotInfo == null || !slotInfo.Success) + { + //just no definet yet ? + log.Debug($"ConnectBuild_Async({genesisSmartReader.GetSlotNr}) - SlotInfo is null."); + } + else if (slotInfo.IsConnected) + { + log.Debug($"ConnectBuild_Async({genesisSmartReader.GetSlotNr}) - Slot is already connected."); + return true; + } + + log.Debug($"ConnectBuild_Async({genesisSmartReader.GetSlotNr}) - Connecting..."); + CancellationToken token = default;//new CancellationToken(); + var connectTask = await genesisSmartReader.CommInterfaceBridge.ConnectAsync(genesisSmartReader.GetSlotNr, token); + log.Debug($"ConnectBuild_Async({genesisSmartReader.GetSlotNr}) Result: Success({connectTask.Success}) - IsConnected({connectTask.IsConnected})"); + return connectTask.Success && connectTask.IsConnected; + } + + /// /// Set Test mode /// @@ -148,19 +667,77 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication /// public bool SetTestMode() { - if (!IsSlotDefined) - { - BuildConnection(genesisHead); - } - - log.Debug("SetTestMode called for iHead: " + genesisHead.ToString()); - bool activityModeActive = SetActivityMode_Active(); - bool optActiveMode = SetOptTestMode(); - - log.Debug("SetTestMode result: optoMod-> " + optActiveMode + " meterModeActive ->" + activityModeActive); - return (optActiveMode && activityModeActive); + return Task.Run(SetTestMode_Async) + .GetAwaiter() + .GetResult(); } - + + + public async Task SetTestMode_Async() + { + try + { + log.Debug("SetTestMode_Async called for iHead: " + genesisHead); + + if (genesisHead == null) + return false; + + if (string.IsNullOrEmpty(genesisHead.CommInterface)) + return false; + + if (genesisHead.CommInterfaceBridge == null) + return false; + + await BuildConnectionAsync(genesisHead); + + + if (genesisHead.DebugLevel == DebugMode.Simulate) + { + log.Debug("SetTestMode_Async() - Simulated response"); + return true; + } + + GciBridge gciBridge = genesisHead.CommInterfaceBridge; + + log.Debug("SetTestMode_Async() - GciBridge created"); + + gciBridge.GciBridgeCfg.EnableExternalAccess = true; + gciBridge.GciBridgeCfg.EnableGuiAccess = false; + gciBridge.Initialize(); + + log.Debug("SetTestMode_Async() - GciBridge initialized"); + + RadioService headService = new RadioService(gciBridge); + var ledModeAsync = await headService.SetLedMode_Async(genesisHead, LedState.active, isConnected); + + if (!ledModeAsync) + { + log.Info( + $"FAILED - SET LED MODE ACTIVE on COM{genesisHead.RfidComPortNr} SlotNr: {genesisHead.GetSlotNr}"); + return false; + } + + isConnected = true; + + try + { + await headService.Disconnect_Async(genesisHead); + } + catch (Exception ex) + { + log.Error("SetTestMode_Async() - DISCONNECT Exception:", ex); + } + + + return ledModeAsync; + } + catch (Exception ex) + { + log.Error("SetTestMode_Async() - Exception:", ex); + return false; + } + } + /// /// Set Active mode /// @@ -168,18 +745,76 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication /// public bool SetActiveMode() { - if (!IsSlotDefined) - { - BuildConnection(genesisHead); - } - - log.Debug("SetActiveMode called for iHead: " + genesisHead.ToString()); - bool optActiveMode = SetOptActiveMode(genesisHead); - //bool activityModeIdle = SetActivityMode_Idle(); - - return optActiveMode; + return Task.Run(SetActiveMode_Async) + .GetAwaiter() + .GetResult(); } - + + + public async Task SetActiveMode_Async() + { + try + { + log.Debug("SetActiveMode_Async called for iHead: " + genesisHead); + + if (genesisHead == null) + return false; + + if (string.IsNullOrEmpty(genesisHead.CommInterface)) + return false; + + if (genesisHead.CommInterfaceBridge == null) + return false; + + await BuildConnectionAsync(genesisHead); + + if (genesisHead.DebugLevel == DebugMode.Simulate) + { + log.Debug("SetActiveMode_Async() - Simulated response"); + return true; + } + + GciBridge gciBridge = genesisHead.CommInterfaceBridge; + + log.Debug("SetActiveMode_Async() - GciBridge created"); + + gciBridge.GciBridgeCfg.EnableExternalAccess = true; + gciBridge.GciBridgeCfg.EnableGuiAccess = false; + gciBridge.Initialize(); + + log.Debug("SetActiveMode_Async() - GciBridge initialized"); + + RadioService headService = new RadioService(gciBridge); + var ledModeAsync = await headService.SetLedMode_Async(genesisHead, LedState.inactive, isConnected); + + if (!ledModeAsync) + { + log.Info( + $"FAILED - SET LED MODE INACTIVE on COM{genesisHead.RfidComPortNr} SlotNr: {genesisHead.GetSlotNr}"); + return false; + } + + isConnected = true; + + try + { + await headService.Disconnect_Async(genesisHead); + } + catch (Exception ex) + { + log.Error("SetActiveMode_Async() - DISCONNECT Exception:", ex); + } + + + return ledModeAsync; + } + catch (Exception ex) + { + log.Error("SetActiveMode_Async() - Exception:", ex); + return false; + } + } + /// /// Set Idle mode - only /// @@ -189,10 +824,10 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication { log.Debug("SetIdleMode called for iHead: " + genesisHead.ToString()); bool activityModeIdle = SetActivityMode_Idle(); - + return activityModeIdle; } - + /// /// Set Test mode - string response /// @@ -204,7 +839,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication if (genesisHead.DebugLevel == DebugMode.Simulate) { isTestModeSuccessful = true; - return "-OK Simulated response-"; + return "-OK SetTestMode Simulated response-"; } try @@ -220,7 +855,18 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication } } - + /// + /// Set Active mode + /// + /// + /// + public bool TurnOffRadio() + { + return Task.Run(CloseConnectionAsync) + .GetAwaiter() + .GetResult(); + } + /// /// Set Optical -> Test mode @@ -240,9 +886,9 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication // if (genesisHead != null) // { // if(genesisHead.RfidComPortNr != 0 && !genesisHead?.CommInterfaceBridgeComponent?.GciExternalInterface?.IsConnected == false) - // BuildConnection(genesisHead); - // - // + // BuildConnection(genesisHead).ConfigureAwait(false).GetAwaiter().GetResult(); + // + // // RadioService headService = new RadioService(genesisHead?.CommInterfaceBridgeComponent); // bool optTestMode = headService.SetOptTestMode(genesisHead); // if (genesisHead.ConfigStruct != null) @@ -254,10 +900,37 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication // { // log.Error("SetOptTestMode() - Exception:" + ex.StackTrace); // } - + return false; - - + + + } + + /// + /// TurnOffRadio - string response + /// + /// + /// + /// + public string TurnOffRadio(ref bool isTestModeSuccessful) + { + if (genesisHead.DebugLevel == DebugMode.Simulate) + { + isTestModeSuccessful = true; + return "-OK TurnOffRadio Simulated response-"; + } + + try + { + bool turnOffRadio = TurnOffRadio(); + isTestModeSuccessful = turnOffRadio; + return turnOffRadio ? "TurnOffRadio - OK" : "TurnOffRadio - FAILED"; + } + catch (Exception ex) + { + log.Error("SetActiveMode() - Exception:" + ex.StackTrace); + return "Set Active Mode - Exception"; + } } /// @@ -271,22 +944,20 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication if (genesisHead.DebugLevel == DebugMode.Simulate) { isTestModeSuccessful = true; - return "-OK Simulated response-"; + return "-OK SetActiveMode Simulated response-"; } - // try - // { - // bool activeMode = SetActiveMode(); - // isTestModeSuccessful = activeMode; - // return activeMode ? "Set Active Mode - OK" : "Set Active Mode - FAILED"; - // } - // catch (Exception ex) - // { - // log.Error("SetActiveMode() - Exception:" + ex.StackTrace); - // return "Set Active Mode - Exception"; - // } - - return "Set Active Mode - No Implemented Exception"; + try + { + bool testMode = SetActiveMode(); + isTestModeSuccessful = testMode; + return testMode ? "Set Active Mode - OK" : "Set Active Mode - FAILED"; + } + catch (Exception ex) + { + log.Error("SetActiveMode() - Exception:" + ex.StackTrace); + return "Set Active Mode - Exception"; + } } /// @@ -302,8 +973,8 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication // if (iHead != null) // { // if(genesisHead.RfidComPortNr != 0 && !genesisHead?.CommInterfaceBridgeComponent?.GciExternalInterface?.IsConnected == false) - // BuildConnection(genesisHead); - // + // BuildConnection(genesisHead).ConfigureAwait(false).GetAwaiter().GetResult(); + // // RadioService headService = new RadioService(genesisHead?.CommInterfaceBridgeComponent); // return headService.SetOptActiveMode(iHead); // } @@ -312,40 +983,66 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication // { // log.Error("SetOptActiveMode() - Exception:" + ex.StackTrace); // } - + return false; } - + /// /// Set activity mode to active /// /// /// /// - private bool SetActivityMode_Active() + private async Task SetActivityMode_Active() { - - // try - // { - // if (genesisHead != null) - // { - // if (genesisHead.RfidComPortNr != 0 && - // !genesisHead?.CommInterfaceBridgeComponent?.GciExternalInterface?.IsConnected == false) - // BuildConnection(genesisHead); - // - // log.Debug("SetActivityMode_Active called for iHead: " + genesisHead.ToString()); - // RadioService headService = new RadioService(genesisHead?.CommInterfaceBridgeComponent); - // return headService.SetActivityMode_Active(genesisHead); - // } - // } - // catch (Exception ex) - // { - // log.Error("SetActivityMode_Active() - Exception:" + ex.StackTrace); - // } - + + try + { + log.Debug("SetActivityMode_Active called for iHead: " + genesisHead); + if (genesisHead == null) return false; + if (string.IsNullOrEmpty(genesisHead.CommInterface)) return false; + if (genesisHead.CommInterfaceBridge == null) return false; + + await BuildConnectionAsync(genesisHead); + + if (genesisHead.DebugLevel == DebugMode.Simulate) + { + log.Debug("SetActivityMode_Active() - Simulated response"); + return true; + } + + GciBridge gciBridge = genesisHead.CommInterfaceBridge; + + log.Debug("SetActivityMode_Active() - GciBridge created"); + + gciBridge.GciBridgeCfg.EnableExternalAccess = true; + gciBridge.GciBridgeCfg.EnableGuiAccess = false; + + gciBridge.Initialize(); + + log.Debug("SetActivityMode_Active() - GciBridge initialized"); + + RadioService headService = new RadioService(gciBridge); + var active = await headService.SetActivityMode_Active(genesisHead, isConnected); + + if (!active) + { + log.Info( $"SetActivityMode_Active not set on COM{genesisHead.RfidComPortNr} SlotNr: {genesisHead.GetSlotNr}"); + return false; + } + + log.Info( $"SetActivityMode_Active set on COM{genesisHead.RfidComPortNr} SlotNr: {genesisHead.GetSlotNr}"); + return true; + } + catch (Exception ex) + { + log.Error("SetActivityMode_Active() - Exception:", ex); + return false; + } + return false; } - + /// /// Set activity mode to idle /// @@ -360,10 +1057,10 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication // { // if (genesisHead.RfidComPortNr != 0 && // !genesisHead?.CommInterfaceBridgeComponent?.GciExternalInterface?.IsConnected == false) - // BuildConnection(genesisHead); - // + // BuildConnection(genesisHead).ConfigureAwait(false).GetAwaiter().GetResult(); + // // log.Debug("SetActivityMode_Idle called for iHead: " + genesisHead.ToString()); - // + // // RadioService headService = new RadioService(genesisHead?.CommInterfaceBridgeComponent); // return headService.SetActivityMode_Idle(genesisHead); // } @@ -372,16 +1069,16 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication // { // log.Error("SetActivityMode_Idle() - Exception:" + ex.StackTrace); // } - + return false; } - + public void Dispose() { - CloseConnection(); + CloseConnectionAsync(); } - + /// /// Read configuration from iHead /// DiagnosticLedState is not readable, mus only be set! @@ -405,16 +1102,16 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication // // if (genesisHead.RfidComPortNr != 0 && // !genesisHead?.CommInterfaceBridgeComponent?.GciExternalInterface?.IsConnected == false) - // BuildConnection(genesisHead); + // BuildConnection(genesisHead).ConfigureAwait(false).GetAwaiter().GetResult(); // // RadioService headService = new RadioService(genesisHead?.CommInterfaceBridgeComponent); // genesisHead.ConfigStruct.PCBNumberString = headService.ReadRequest_PCB(ref genesisHead); // genesisHead.ConfigStruct.StatusMode = headService.GetActivityStatusMode(genesisHead); // genesisHead.ConfigStruct.Unit = headService.GetUnit(genesisHead); - // + // // if (ledState != DiagnosticLedState.StatusUnknown) // do set // { - // genesisHead.ConfigStruct.OpthoStatusMode = headService.SetOptoStatusMode(genesisHead, ledState); + // genesisHead.ConfigStruct.OpthoStatusMode = headService.SetLedMode_Async(genesisHead, ledState); // } // else // { @@ -436,5 +1133,927 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication return false; } } + + public string SetPasswordSlot() + { + if (genesisHead != null && genesisHead.DebugLevel == DebugMode.Simulate) + { + log.Debug("Connect() - Simulated response"); + return "Simulated Connect"; + } + return Task.Run(() => SetPasswordSlot_Async(genesisHead)) + .GetAwaiter() + .GetResult(); + } + + private async Task SetPasswordSlot_Async(GenesisSmartReader genesisSmartReader) + { + try + { + log.Debug("SetPasswordSlot_Async called for iHead: " + genesisHead); + if (genesisHead == null) return string.Empty; + if (string.IsNullOrEmpty(genesisHead.CommInterface)) return string.Empty; + if (genesisHead.CommInterfaceBridge == null) return string.Empty; + //GET PASSWORD SLOT + string serialNr = genesisSmartReader.SerialNr; + CancellationToken token = default; + var result = await genesisSmartReader.CommInterfaceBridge.GetPasswordAsync(serialNr, token); + + if (!result.Success) + { + log.Error($"SetPasswordSlot_Async({serialNr}) - GetPasswordAsync failed. Result: {result.Message}"); + return $"Failed FIND PASSWORD, Deatils: " + result.Message; + } + + log.Debug("GetPasswordAsync PCB=" + serialNr + " Result: " + result); + string txtPassword = result.Password; + + log.Debug($"SetPasswordSlot_Async( Slot: {genesisSmartReader.GetSlotNr}) - set password to: " + txtPassword.Substring(0, 4) + "************"); + var gciSetPasswordResult = await genesisSmartReader.CommInterfaceBridge.SetPasswordAsync(genesisSmartReader.GetSlotNr,txtPassword, token); + log.Debug($"SetPasswordSlot_Async( Slot: {genesisSmartReader.GetSlotNr}) - SetPasswordAsync Result: " + gciSetPasswordResult); + + return gciSetPasswordResult.Success ? ResultOk : ResultNok; + } + catch (Exception ex) + { + log.Error($"SetPasswordSlot_Async({genesisHead.GetSlotNr}) - Exception:", ex); + return ex.Message; + } + } + + public string LoginSlot() + { + if (genesisHead != null && genesisHead.DebugLevel == DebugMode.Simulate) + { + log.Debug("Connect() - Simulated response"); + return "Simulated Connect"; + } + return Task.Run(() => LoginSlot_Async(genesisHead)) + .GetAwaiter() + .GetResult(); + } + + private async Task LoginSlot_Async(GenesisSmartReader genesisSmartReader) + { + try + { + log.Debug("LoginSlot_Async called for iHead: " + genesisHead); + + if (genesisHead == null) return string.Empty; + if (string.IsNullOrEmpty(genesisHead.CommInterface)) return string.Empty; + if (genesisHead.CommInterfaceBridge == null) return string.Empty; + + CancellationToken token = default; + + log.Debug($"LoginSlot_Async( Slot: {genesisSmartReader.GetSlotNr}) - Start"); + var gciSetPasswordResult = await genesisSmartReader.CommInterfaceBridge.LoginAsync(genesisSmartReader.GetSlotNr, token); + log.Debug($"LoginSlot_Async( Slot: {genesisSmartReader.GetSlotNr}) - SetPasswordAsync Result: " + gciSetPasswordResult); + + return gciSetPasswordResult.Success ? ResultOk : ResultNok; + } + catch (Exception ex) + { + log.Error($"LoginSlot_Async({genesisHead.GetSlotNr}) - Exception:", ex); + return ex.Message; + } + } + + public BridgeComponents.GciBridge.Interfaces.PublicModels.GciFullLoginResult GroupedLoginSlot() + { + if (genesisHead != null && genesisHead.DebugLevel == DebugMode.Simulate) + { + log.Debug("Connect() - Simulated response"); + return new BridgeComponents.GciBridge.Interfaces.PublicModels.GciFullLoginResult + { + SlotId = genesisHead.GetSlotNr, + Success = true, + Message = "Simulated Connect", + ConnectResult = null, + PcbResult = null, + PasswordResult = null, + SetPasswordResult = null, + LoginResult = null, + }; + } + + var gciFullLoginResult = Task.Run(() => GroupedLoginSlot_Async(genesisHead)) + .GetAwaiter() + .GetResult(); + + return gciFullLoginResult; + } + + public string GroupedLoginSlotStr() + { + if (genesisHead != null && genesisHead.DebugLevel == DebugMode.Simulate) + { + log.Debug("Connect() - Simulated response"); + return "Simulated Connect"; + } + + var gciFullLoginResult = Task.Run(() => GroupedLoginSlot_Async(genesisHead)) + .GetAwaiter() + .GetResult(); + + return gciFullLoginResult.Success ? ResultOk : ResultNok; + } + + private async Task GroupedLoginSlot_Async(GenesisSmartReader genesisSmartReader) + { + try + { + log.Debug("GroupedLoginSlot_Async called for iHead: " + genesisHead); + + var gciFullLoginResult = new BridgeComponents.GciBridge.Interfaces.PublicModels.GciFullLoginResult() + { + Success = false, + }; + + if (genesisHead == null) return gciFullLoginResult; + if (string.IsNullOrEmpty(genesisHead.CommInterface)) return gciFullLoginResult; + if (genesisHead.CommInterfaceBridge == null) return gciFullLoginResult; + + CancellationToken token = default; + + log.Debug($"GroupedLoginSlot_Async( Slot: {genesisSmartReader.GetSlotNr}) - Start"); + BridgeComponents.GciBridge.Interfaces.PublicModels.GciFullLoginResult connectFullPassLoginWithRetryAsync = await genesisSmartReader.CommInterfaceBridge.ConnectFullPassLoginWithRetryAsync(genesisSmartReader.GetSlotNr, token); + log.Debug($"GroupedLoginSlot_Async( Slot: {genesisSmartReader.GetSlotNr}) - Result: " + connectFullPassLoginWithRetryAsync); + + if (connectFullPassLoginWithRetryAsync?.PcbResult?.Success == true) + { + log.Debug($"Setting PCB: {connectFullPassLoginWithRetryAsync?.PcbResult?.Result?.PcbId} for Head: {genesisSmartReader.Name}"); + genesisSmartReader.SerialNr = connectFullPassLoginWithRetryAsync?.PcbResult?.Result?.PcbId; + if (genesisSmartReader.ConfigStruct != null) + { + genesisSmartReader.ConfigStruct.PCBNumberString = genesisSmartReader.SerialNr; + } + } + + return connectFullPassLoginWithRetryAsync; + } + catch (Exception ex) + { + log.Error($"GroupedLoginSlot_Async({genesisHead.GetSlotNr}) - Exception:", ex); + return new BridgeComponents.GciBridge.Interfaces.PublicModels.GciFullLoginResult() + { + Success = false, + Message = ex.Message + }; + } + } + + public string SetTestModeSlot() + { + if (genesisHead != null && genesisHead.DebugLevel == DebugMode.Simulate) + { + log.Debug("Connect() - Simulated response"); + return "Simulated SetTestModeSlot"; + } + return Task.Run(() => SetTestModeSlot_Async(genesisHead)) + .GetAwaiter() + .GetResult(); + } + + private async Task SetTestModeSlot_Async(GenesisSmartReader genesisSmartReader) + { + try + { + log.Debug("SetTestModeSlot_Async called for iHead: " + genesisHead); + + if (genesisHead == null) return string.Empty; + if (string.IsNullOrEmpty(genesisHead.CommInterface)) return string.Empty; + GciBridge gciBridge = genesisHead.CommInterfaceBridge; + if (gciBridge == null) return string.Empty; + + CancellationToken token = default; + + //Get Activity Status + LedState ledMode = LedState.active; // swich on LED + byte valueLed = (ledMode == LedState.active) ? (byte)6 : (byte)0; + + log.Debug($"SetTestModeSlot_Async( Slot: {genesisSmartReader.GetSlotNr}) - Start - Set Led Mode: {valueLed}"); + var registerWriteResult = await gciBridge.WriteRegisterWithRetryAsync(genesisSmartReader.GetSlotNr, RadioService.LedMode, valueLed, false, false, token); + + if (registerWriteResult == null || !registerWriteResult.Success) + { + log.Error($"SetTestModeSlot_Async( Slot: {genesisSmartReader.GetSlotNr}) - WriteRegisterAsync failed. Result: {registerWriteResult}"); + return "Failed to set Led Mode"; + } + log.Debug($"SetTestModeSlot_Async( Slot: {genesisSmartReader.GetSlotNr}) - SetTestModeSlot_Async Result: " + registerWriteResult); + + return registerWriteResult.Success ? ResultOk : ResultNok; + } + catch (Exception ex) + { + log.Error($"LoginSlot_Async({genesisHead.GetSlotNr}) - Exception:", ex); + return ex.Message; + } + } + + public string SetActiveModeSlot() + { + if (genesisHead != null && genesisHead.DebugLevel == DebugMode.Simulate) + { + log.Debug("Connect() - Simulated response"); + return "Simulated SetActiveModeSlot"; + } + return Task.Run(() => SetActiveModeSlot_Async(genesisHead)) + .GetAwaiter() + .GetResult(); + } + + + + private async Task SetActiveModeSlot_Async(GenesisSmartReader genesisSmartReader) + { + try + { + log.Debug("SetActiveModeSlot_Async called for iHead: " + genesisHead); + + if (genesisHead == null) return string.Empty; + if (string.IsNullOrEmpty(genesisHead.CommInterface)) return string.Empty; + GciBridge gciBridge = genesisHead.CommInterfaceBridge; + if (gciBridge == null) return string.Empty; + + CancellationToken token = default; + + //Get Activity Status + LedState ledMode = LedState.inactive; // swich on LED + byte valueLed = (ledMode == LedState.active) ? (byte)6 : (byte)0; + + log.Debug( + $"SetActiveModeSlot_Async( Slot: {genesisSmartReader.GetSlotNr}) - Start - Set Led Mode: {valueLed}"); + var registerWriteResult = await gciBridge.WriteRegisterWithRetryAsync(genesisSmartReader.GetSlotNr, + RadioService.LedMode, valueLed, false, false, token); + + if (registerWriteResult == null || !registerWriteResult.Success) + { + log.Error( + $"SetActiveModeSlot_Async( Slot: {genesisSmartReader.GetSlotNr}) - WriteRegisterAsync failed. Result: {registerWriteResult}"); + return "Failed to disable Led Mode"; + } + + log.Debug( + $"SetTestModeSlot_Async( Slot: {genesisSmartReader.GetSlotNr}) - SetTestModeSlot_Async Result: " + + registerWriteResult); + + return registerWriteResult.Success ? ResultOk : ResultNok; + } + catch (Exception ex) + { + log.Error($"LoginSlot_Async({genesisHead.GetSlotNr}) - Exception:", ex); + return ex.Message; + } + } + + public string WriteQ3Calibration(TestMethodCfg cfg, Test test, WaterMeter wm) + { + if (genesisHead != null && genesisHead.DebugLevel == DebugMode.Simulate) + { + if (test == null || wm == null) return "Missing Genesis meter or test"; + if (!genesisHead.CalculateQ3Calibration() || !genesisHead.Q3CalibValid) + return "Q3 simulation requires valid measurement data"; + var result = ProcessData.BatchRslts.GetTestRslt(test.Name, test.Part); + StoreCalibrationValuesResults(result, genesisHead, wm); + foreach (var row in result.GetCalibrationFactors(wm)) + { + row.Stored = false; + row.ErrorStr = "Simulated; no register write."; + } + return ResultOk; + } + + if (cfg == null) + { + log.Error("WriteQ3Calibration() - Missing TestMethodCfg"); + return "Missing TestMethodCfg"; + } + if (test == null) + { + log.Error("WriteQ3Calibration() - Missing Test"); + return "Missing Test"; + } + + return Task.Run(() => WriteQ3Calibration_Async(genesisHead, cfg, test, wm)) + .GetAwaiter() + .GetResult(); + } + + + + private async Task WriteQ3Calibration_Async(GenesisSmartReader genesisSmartReader, + TestMethodCfg cfg, + Test test, WaterMeter wm) + { + try + { + log.Debug("WriteQ3Calibration_Async called for iHead: " + genesisHead?.Name + " , cfg: " + cfg?.Name + " , test: " + test?.Name); + + if (genesisHead == null) + { + log.Error("WriteQ3Calibration_Async() - Missing GenesisSmartReader"); + return string.Empty; + } + if (string.IsNullOrEmpty(genesisHead.CommInterface)) + { + log.Error("WriteQ3Calibration_Async() - Missing CommInterface"); + return string.Empty; + } + GciBridge gciBridge = genesisHead.CommInterfaceBridge; + if (gciBridge == null) + { + log.Error("WriteQ3Calibration_Async() - Missing GciBridge"); + return string.Empty; + } + Results.Entities.TestRslt tstRslt = ProcessData.BatchRslts.GetTestRslt(test.Name, test.Part); + log.Debug($"WriteQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - Test: {test.Name} - Part: {test.Part} - IsTestRslt: {(tstRslt==null?true:false)}"); + + try + { + if (tstRslt.GetCalibrationFactors(wm).Count == 0) + { + for (int i = 0; i < genesisSmartReader.ChannelsCount; i++) + { + tstRslt.GetCalibrationFactors(wm).Add(new TestRsltCalibFactor() + { + Stored = false, + CalibFactorIndex = i + } + ); + } + } + }catch(Exception ex) + { + log.Error($"WriteQ3Calibration_Async() - DB Exception: {ex.Message}"); + } + + CancellationToken token = default; + + bool areInitialisedData = genesisSmartReader.CalculateQ3Calibration(); + if (!areInitialisedData) + { + log.Error("WriteQ3Calibration_Async() - CalculateQ3Calibration Initialised Data not valid"); + return "CalculateQ3Calibration Initialised Data not valid"; + } + + StoreCalibrationValuesResults(tstRslt, genesisSmartReader, wm); + + if (!genesisSmartReader.Q3CalibValid) + { + log.Error("WriteQ3Calibration_Async() - Q3Channel not valid"); + return "Q3Channel not valid"; + } + + //Get Activity Status + LedState ledMode = LedState.inactive; // swich on LED + byte valueLed = (ledMode == LedState.active) ? (byte)6 : (byte)0; + + UInt16 calibFactor1 = Convert.ToUInt16(genesisSmartReader.Q3Calib_Ch1Value); + UInt16 calibFactor2 = Convert.ToUInt16(genesisSmartReader.Q3Calib_Ch2Value); + UInt16 calibFactor3 = Convert.ToUInt16(genesisSmartReader.Q3Calib_Ch3Value); + + UInt16 valueSampleRate = 2; + UInt16 ResetAccumulatorsValue = 0; + UInt16 ForwardArrowValue = 0; + UInt16 StoreCalibrationValue = 1; + + + + + + log.Debug( $"WriteQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - Start"); + + log.Debug( $"WriteQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - Start - Set CalFactor1: {calibFactor1}"); + var CalFactor1AsyncResult = await gciBridge.WriteRegisterWithRetryAsync(genesisSmartReader.GetSlotNr, RadioService.CalFactor1, calibFactor1, false, false, token); + if (CalFactor1AsyncResult == null || !CalFactor1AsyncResult.Success) + { + log.Error( $"WriteQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - CalFactor1AsyncResult failed. Result: {CalFactor1AsyncResult}"); + return "Failed to set CalFactor1"; + } + wm.OrigCalibFactor = calibFactor1; + if (genesisSmartReader.Q3CalibDiffPercentageValue.Length == 3) + wm.Q2ErrWOCorrection = genesisSmartReader.Q3CalibDiffPercentageValue[0]; + //CH3 to DB + try + { + if (tstRslt != null && + tstRslt?.GetCalibrationFactors(wm)?.Count == 3 && + tstRslt?.GetCalibrationFactors(wm)?[0] != null) + { + tstRslt.GetCalibrationFactors(wm)[0].CalculatedCalibFactor = Convert.ToInt32(calibFactor1); + tstRslt.GetCalibrationFactors(wm)[0].Stored = false; + tstRslt.GetCalibrationFactors(wm)[0].IsCalibFactorValid = true; + tstRslt.GetCalibrationFactors(wm)[0].Error = genesisSmartReader.Q3CalibDiffPercentageValue[0]; + } + log.Debug( $"PrepareQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - DB Stored tstRslt:{tstRslt.Name()} - CalFactor3: {calibFactor1}"); + } + catch (Exception ex) + { + log.Error($"PrepareQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - DB CH1 Exception:", ex); + } + + + log.Debug( $"WriteQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - Start - Set CalFactor2: {calibFactor2}"); + var CalFactor2AsyncResult = await gciBridge.WriteRegisterWithRetryAsync(genesisSmartReader.GetSlotNr, RadioService.CalFactor2, calibFactor2, false, false, token); + if (CalFactor2AsyncResult == null || !CalFactor2AsyncResult.Success) + { + log.Error( $"WriteQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - CalFactor2AsyncResult failed. Result: {CalFactor2AsyncResult}"); + return "Failed to set CalFactor2"; + } + wm.CalibFactorLNA = calibFactor2; + if (genesisSmartReader.Q3CalibDiffPercentageValue.Length == 3) + wm.OrigCalibFactorLNA = genesisSmartReader.Q3CalibDiffPercentageValue[1]; + //CH3 to DB + try + { + if (tstRslt != null && + tstRslt?.GetCalibrationFactors(wm)?.Count == 3 && + tstRslt?.GetCalibrationFactors(wm)?[1] != null) + { + tstRslt.GetCalibrationFactors(wm)[1].CalculatedCalibFactor = Convert.ToInt32(calibFactor2); + tstRslt.GetCalibrationFactors(wm)[1].Stored = false; + tstRslt.GetCalibrationFactors(wm)[1].IsCalibFactorValid = true; + tstRslt.GetCalibrationFactors(wm)[1].Error = genesisSmartReader.Q3CalibDiffPercentageValue[1]; + } + log.Debug( $"PrepareQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - DB Stored tstRslt:{tstRslt.Name()} - CalFactor3: {calibFactor2}"); + } + catch (Exception ex) + { + log.Error($"PrepareQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - DB CH2 Exception:", ex); + } + + + + log.Debug( $"WriteQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - Start - Set CalFactor3: {calibFactor3}"); + var CalFactor3AsyncResult = await gciBridge.WriteRegisterWithRetryAsync(genesisSmartReader.GetSlotNr, RadioService.CalFactor3, calibFactor3, false, false, token); + if (CalFactor3AsyncResult == null || !CalFactor3AsyncResult.Success) + { + log.Error( $"WriteQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - CalFactor3AsyncResult failed. Result: {CalFactor3AsyncResult}"); + return "Failed to set CalFactor3"; + } + wm.CalibFactor = calibFactor3; + if (genesisSmartReader.Q3CalibDiffPercentageValue.Length == 3) + wm.Diff2Hz8Hz = genesisSmartReader.Q3CalibDiffPercentageValue[2]; + //CH3 to DB + try + { + if (tstRslt != null && + tstRslt?.GetCalibrationFactors(wm)?.Count == 3 && + tstRslt?.GetCalibrationFactors(wm)?[2] != null) + { + tstRslt.GetCalibrationFactors(wm)[2].CalculatedCalibFactor = Convert.ToInt32(calibFactor3); + tstRslt.GetCalibrationFactors(wm)[2].Stored = false; + tstRslt.GetCalibrationFactors(wm)[2].IsCalibFactorValid = true; + tstRslt.GetCalibrationFactors(wm)[2].Error = genesisSmartReader.Q3CalibDiffPercentageValue[2]; + } + log.Debug( $"PrepareQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - DB Stored tstRslt:{tstRslt.Name()} - CalFactor3: {calibFactor3}"); + } + catch (Exception ex) + { + log.Error($"PrepareQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - DB CH3 Exception:", ex); + } + + + log.Info( $"WriteQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - Set DONE CalFactor1: {calibFactor1}, CalFactor2: {calibFactor2}, CalFactor2: {calibFactor3}"); + + var SampleRateAsyncResult = await gciBridge.WriteRegisterWithRetryAsync(genesisSmartReader.GetSlotNr, RadioService.SampleRate, valueSampleRate, false, false, token); + if (SampleRateAsyncResult == null || !SampleRateAsyncResult.Success) + { + log.Error( $"WriteQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - SampleRateAsyncResult failed. Result: {SampleRateAsyncResult}"); + return "Failed to set SampleRate"; + } + + var LedModeAsyncResult = await gciBridge.WriteRegisterWithRetryAsync(genesisSmartReader.GetSlotNr, RadioService.LedMode, valueLed, false, false, token); + if (LedModeAsyncResult == null || !LedModeAsyncResult.Success) + { + log.Error( $"WriteQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - LedModeAsyncResult failed. Result: {LedModeAsyncResult}"); + return "Failed to disable Led Mode"; + } + + var ResetAccumulatorsAsyncResult = await gciBridge.WriteRegisterWithRetryAsync(genesisSmartReader.GetSlotNr, RadioService.ResetAccumulators, ResetAccumulatorsValue, false, false, token); + if (ResetAccumulatorsAsyncResult == null || !ResetAccumulatorsAsyncResult.Success) + { + log.Error( $"WriteQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - ResetAccumulatorsAsyncResult failed. Result: {ResetAccumulatorsAsyncResult}"); + return "Failed set ResetAccumulators to 1"; + } + + var ForwardArrowAsyncResult = await gciBridge.WriteRegisterWithRetryAsync(genesisSmartReader.GetSlotNr, RadioService.ForwardArrow, ForwardArrowValue, false, false, token); + if (ForwardArrowAsyncResult == null || !ForwardArrowAsyncResult.Success) + { + log.Error( $"WriteQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - ForwardArrowAsyncResult failed. Result: {ForwardArrowAsyncResult}"); + return "Failed set ForwardArrow to 0"; + } + + var StoreCalibrationAsyncResult = await gciBridge.WriteRegisterWithRetryAsync(genesisSmartReader.GetSlotNr, RadioService.StoreCalibration, StoreCalibrationValue, false, false, token); + if (StoreCalibrationAsyncResult == null || !StoreCalibrationAsyncResult.Success) + { + log.Error( $"WriteQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - StoreCalibrationAsyncResult failed. Result: {StoreCalibrationAsyncResult}"); + return "Failed set StoreCalibration to 1"; + } + + log.Debug( $"WriteQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - StoreCalibrationAsyncResult Result: " + StoreCalibrationAsyncResult); + + foreach (var row in tstRslt.GetCalibrationFactors(wm)) + { + row.Stored = true; + row.ErrorStr = string.Empty; + } + return StoreCalibrationAsyncResult.Success ? ResultOk : ResultNok; + } + catch (Exception ex) + { + log.Error($"WriteQ3Calibration_Async({genesisHead.GetSlotNr}) - Exception:", ex); + return ex.Message; + } + } + + private void StoreCalibrationValuesResults(TestRslt result, GenesisSmartReader reader, WaterMeter meter) + { + if (result == null) throw new InvalidOperationException("Missing Q3 test result"); + var rows = result.GetCalibrationFactors(meter); + var values = new[] { reader.Q3Calib_Ch1Value, reader.Q3Calib_Ch2Value, reader.Q3Calib_Ch3Value }; + for (int channel = 0; channel < 3; channel++) + { + var row = rows[channel]; + var value = values[channel]; + var difference = reader.Q3CalibDiffPercentageValue[channel]; + bool finite = !double.IsNaN(value) && !double.IsInfinity(value) && value >= 1 && value <= ushort.MaxValue; + row.BaseCalibFactor = (int)reader.Q3CalibValue[channel]; + row.CalculatedCalibFactor = finite ? Convert.ToInt32(value) : 0; + row.IsCalibFactorValid = finite && reader.Q3CalibValid; + row.Error = double.IsNaN(difference) || double.IsInfinity(difference) ? 0 : difference; + row.Stored = false; + row.ErrorStr = row.IsCalibFactorValid ? string.Empty : "Invalid Q3 measurement or factor"; + } + } + + public string PrepareQ3Calibration(TestMethodCfg cfg, Test test, WaterMeter wm) + { + double[] factors; + string factorError; + if (!GenesisCalibrationFactors.TryParse(wm?.WaterMeterData?.Text1, wm?.WaterMeterData?.Text2, + wm?.WaterMeterData?.Text3, out factors, out factorError)) return factorError; + if (genesisHead == null || test == null || wm == null) return "Missing Genesis meter or test"; + genesisHead.SetQ3Calibration(factors); + var prepared = ProcessData.BatchRslts.GetTestRslt(test.Name, test.Part).GetCalibrationFactors(wm); + for (int channel = 0; channel < 3; channel++) + { + prepared[channel].BaseCalibFactor = (int)factors[channel]; + prepared[channel].Stored = false; + prepared[channel].IsCalibFactorValid = false; + } + + log.Debug("PrepareQ3Calibration() - Start, Head: " + genesisHead?.Name); + if (genesisHead != null && genesisHead.DebugLevel == DebugMode.Simulate) + { + log.Debug("PrepareQ3Calibration() - Simulated response - Config: " + cfg.ToString() + " Test: " + test.ToString() + " WaterMeter: " + wm.ToString()); + try + { + Results.Entities.TestRslt tstRslt = ProcessData.BatchRslts.GetTestRslt(test.Name, test.Part); + if (tstRslt.GetCalibrationFactors(wm).Count > 0) + { + tstRslt.GetCalibrationFactors(wm).Clear(); + } + if (tstRslt.GetCalibrationFactors(wm).Count == 0) + { + for (int i = 0; i < genesisHead.ChannelsCount; i++) + { + tstRslt.GetCalibrationFactors(wm).Add(new TestRsltCalibFactor() + { + Stored = false, + CalibFactorIndex = i, + BaseCalibFactor = 15625, + } + ); + } + + log.Debug($" Calib factor from Text1: {wm.WaterMeterData.Text1}"); + log.Debug($" Calib factor from Text2: {wm.WaterMeterData.Text2}"); + log.Debug($" Calib factor from Text3: {wm.WaterMeterData.Text3}"); + } + }catch(Exception ex) + { + log.Error($"PrepareQ3Calibration() - Simulated DB Exception: {ex.Message}"); + } + + return ResultOk;//"Simulated Connect"; + } + + + if (cfg == null) + { + log.Error($"PrepareQ3Calibration({genesisHead?.Name}) - Missing TestMethodCfg"); + return "PrepareQ3Calibration - Missing TestMethodCfg"; + } + + if (test == null) + { + log.Error($"PrepareQ3Calibration({genesisHead?.Name}) - Missing Test"); + return "PrepareQ3Calibration - Missing Test"; + } + + return Task.Run(() => PrepareQ3Calibration_Async(genesisHead, cfg, test, wm)) + .GetAwaiter() + .GetResult(); + } + + + private async Task PrepareQ3Calibration_Async(GenesisSmartReader genesisSmartReader, + TestMethodCfg cfg, + Test test, WaterMeter wm) + { + try + { + log.Debug("PrepareQ3Calibration_Async called for iHead: " + genesisHead?.Name + ", cfg: " + cfg?.Name + ", test: " + test?.Name); + + if (genesisHead == null) + { + log.Error("PrepareQ3Calibration_Async() - Missing GenesisSmartReader"); + return string.Empty; + } + if (string.IsNullOrEmpty(genesisHead.CommInterface)) + { + log.Error("PrepareQ3Calibration_Async() - Missing CommInterface"); + return string.Empty; + } + GciBridge gciBridge = genesisHead.CommInterfaceBridge; + if (gciBridge == null) + { + log.Error("PrepareQ3Calibration_Async() - Missing GciBridge"); + return string.Empty; + } + + + + Results.Entities.TestRslt tstRslt = null; + + try + { + if (test == null) + { + log.Error($"PrepareQ3Calibration_Async({genesisHead?.Name}) - Missing Test"); + return "Valid Test Missing!"; + } + tstRslt = ProcessData.BatchRslts.GetTestRslt(test.Name, test.Part); + log.Debug($"PrepareQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - Test: {test.Name} - Part: {test.Part} - IsTestRslt: {(tstRslt==null?true:false)}"); + if (tstRslt?.GetCalibrationFactors(wm)?.Count > 0) + { + tstRslt?.GetCalibrationFactors(wm).Clear(); + } + if (tstRslt?.GetCalibrationFactors(wm)?.Count == 0) + { + for (int i = 0; i < genesisSmartReader.ChannelsCount; i++) + { + tstRslt.GetCalibrationFactors(wm).Add(new TestRsltCalibFactor() + { + Stored = false, + CalibFactorIndex = i + } + ); + } + } + } + catch (Exception ex) + { + log.Error($"PrepareQ3Calibration_Async({genesisSmartReader.GetSlotNr}) - DB TestRslt Exception:", ex); + return ex.Message; + } + + + CancellationToken token = default; + + //Get Activity Status + LedState ledMode = LedState.active; // swich on LED + byte valueLed = (ledMode == LedState.active) ? (byte)6 : (byte)0; + //TODO BUMI - implement variable values for Q3Channel + UInt16 valueSampleRate = 10; + + log.Debug( $"PrepareQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - Calib Factors from Dialog - Text1:{wm?.WaterMeterData?.Text1} Text2:{ wm?.WaterMeterData?.Text2}, Text3: {wm?.WaterMeterData?.Text3}"); + ushort calibrationFactor1 = Convert.ToUInt16(genesisSmartReader?.Q3CalibValue[0]); + log.Debug( $"PrepareQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - Start - Set CalFactor1: {calibrationFactor1}"); + var CalFactor1AsyncResult = await gciBridge.WriteRegisterWithRetryAsync(genesisSmartReader.GetSlotNr, RadioService.CalFactor1, calibrationFactor1, false, false, token); + if (CalFactor1AsyncResult == null || !CalFactor1AsyncResult.Success) + { + log.Error( $"PrepareQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - CalFactor1AsyncResult failed. Result: {CalFactor1AsyncResult}"); + return "Failed to disable Led Mode"; + } + + //CH1 to DB + try + { + if (tstRslt != null && + tstRslt?.GetCalibrationFactors(wm)?.Count == 3 && + tstRslt?.GetCalibrationFactors(wm)?[0] != null) + { + tstRslt.GetCalibrationFactors(wm)[0].BaseCalibFactor = Convert.ToInt32(calibrationFactor1); + tstRslt.GetCalibrationFactors(wm)[0].Stored = false; + } + //wm.OrigCalibFactor = calibrationFactor1; // now dosabled + log.Debug( $"PrepareQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - DB Stored tstRslt:{tstRslt.Name()} - CalFactor1: {calibrationFactor1}"); + } + catch (Exception ex) + { + log.Error($"PrepareQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - DB CH1 Exception:", ex); + } + + + ushort calibrationFactor2 = Convert.ToUInt16(genesisSmartReader?.Q3CalibValue[1]); + log.Debug( $"PrepareQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - Start - Set CalFactor2: {calibrationFactor2}"); + var CalFactor2AsyncResult = await gciBridge.WriteRegisterWithRetryAsync(genesisSmartReader.GetSlotNr, RadioService.CalFactor2, calibrationFactor2, false, false, token); + if (CalFactor2AsyncResult == null || !CalFactor2AsyncResult.Success) + { + log.Error( $"PrepareQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - CalFactor2AsyncResult failed. Result: {CalFactor2AsyncResult}"); + return "Failed to disable Led Mode"; + } + //CH2 to DB + try + { + if (tstRslt != null && + tstRslt?.GetCalibrationFactors(wm)?.Count == 3 && + tstRslt?.GetCalibrationFactors(wm)?[1] != null) + { + tstRslt.GetCalibrationFactors(wm)[1].BaseCalibFactor = Convert.ToInt32(calibrationFactor2); + tstRslt.GetCalibrationFactors(wm)[1].Stored = false; + } + //wm.CalibFactorLNA = calibrationFactor2; // now dosabled + log.Debug( $"PrepareQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - DB Stored tstRslt:{tstRslt.Name()} - CalFactor2: {calibrationFactor2}"); + } + catch (Exception ex) + { + log.Error($"PrepareQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - DB CH2 Exception:", ex); + } + + + ushort calibrationFactor3 = Convert.ToUInt16(genesisSmartReader?.Q3CalibValue[2]); + log.Debug( $"PrepareQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - Start - Set CalFactor1: {calibrationFactor3}"); + var CalFactor3AsyncResult = await gciBridge.WriteRegisterWithRetryAsync(genesisSmartReader.GetSlotNr, RadioService.CalFactor3, calibrationFactor3, false, false, token); + if (CalFactor3AsyncResult == null || !CalFactor3AsyncResult.Success) + { + log.Error( $"PrepareQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - CalFactor3AsyncResult failed. Result: {CalFactor3AsyncResult}"); + return "Failed to disable Led Mode"; + } + //CH3 to DB + try + { + if (tstRslt != null && + tstRslt?.GetCalibrationFactors(wm)?.Count == 3 && + tstRslt?.GetCalibrationFactors(wm)?[2] != null) + { + tstRslt.GetCalibrationFactors(wm)[2].BaseCalibFactor = Convert.ToInt32(calibrationFactor3); + tstRslt.GetCalibrationFactors(wm)[2].Stored = false; + } + //wm.CalibFactor = calibrationFactor3; // now dosabled + log.Debug( $"PrepareQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - DB Stored tstRslt:{tstRslt.Name()} - CalFactor3: {calibrationFactor3}"); + } + catch (Exception ex) + { + log.Error($"PrepareQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - DB CH3 Exception:", ex); + } + + + + var SampleRateAsyncResult = await gciBridge.WriteRegisterWithRetryAsync(genesisSmartReader.GetSlotNr, RadioService.SampleRate, valueSampleRate, false, false, token); + if (SampleRateAsyncResult == null || !SampleRateAsyncResult.Success) + { + log.Error( $"PrepareQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - SampleRateAsyncResult failed. Result: {SampleRateAsyncResult}"); + return "Failed to disable Led Mode"; + } + + var LedModeAsyncResult = await gciBridge.WriteRegisterWithRetryAsync(genesisSmartReader.GetSlotNr, RadioService.LedMode, valueLed, false, false, token); + if (LedModeAsyncResult == null || !LedModeAsyncResult.Success) + { + log.Error( $"PrepareQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - LedModeAsyncResult failed. Result: {LedModeAsyncResult}"); + return "Failed to disable Led Mode"; + } + + log.Debug( $"PrepareQ3Calibration_Async( Slot: {genesisSmartReader.GetSlotNr}) - PrepareQ3Calibration_Async Result: " + LedModeAsyncResult); + + return LedModeAsyncResult.Success ? ResultOk : ResultNok; + } + catch (Exception ex) + { + log.Error($"PrepareQ3Calibration_Async({genesisHead.GetSlotNr}) - Exception:", ex); + return ex.Message; + } + } + + + /// + /// Used for test only. + /// + /// + /// + /// + /// + + + public string CheckMeterPrepare() + { + if (genesisHead != null && genesisHead.DebugLevel == DebugMode.Simulate) + { + log.Debug("Connect() - Simulated response"); + return ResultOk;//"Simulated Connect"; + } + return Task.Run(() => CheckMeterPrepare_Async(genesisHead)) + .GetAwaiter() + .GetResult(); + } + + private async Task CheckMeterPrepare_Async(GenesisSmartReader genesisSmartReader) + { + try + { + log.Debug("CheckMeterPrepare_Async called for iHead: " + genesisHead); + + if (genesisHead == null) return string.Empty; + if (string.IsNullOrEmpty(genesisHead.CommInterface)) return string.Empty; + GciBridge gciBridge = genesisHead.CommInterfaceBridge; + if (gciBridge == null) return string.Empty; + + CancellationToken token = default; + + //Get Activity Status + UInt16 valueTrigerIdle = 0; + log.Debug( $"CheckMeterPrepare_Async( Slot: {genesisSmartReader.GetSlotNr}) - Start - Will Set TriggerIdle: {valueTrigerIdle}"); + + var TriggerIdleAsyncResult = await gciBridge.ReadRegisterWithRetryAsync(genesisSmartReader.GetSlotNr, RadioService.TriggerIdle); + if (TriggerIdleAsyncResult == null || !TriggerIdleAsyncResult.Success) + { + log.Error( $"CheckMeterPrepare_Async( Slot: {genesisSmartReader.GetSlotNr}) - CheckMeterPrepare failed. Result: {TriggerIdleAsyncResult}"); + //return "Failed to disable Led Mode"; + } + + try + { + UInt32 int32 = ParseRawHexToUInt32(TriggerIdleAsyncResult?.Result?.RawHex); + if (int32 == 0) + { + log.Debug("Already set "); + return ResultOk; + } + } + catch (Exception ex) + { + log.Error( $"CheckMeterPrepare_Async( Slot: {genesisSmartReader.GetSlotNr}) - CheckMeterPrepare failed. Result: {TriggerIdleAsyncResult}"); + } + + var CalFactor2AsyncResult = await gciBridge.WriteRegisterWithRetryAsync(genesisSmartReader.GetSlotNr, RadioService.TriggerIdle, valueTrigerIdle, false, false, token); + if (CalFactor2AsyncResult == null || !CalFactor2AsyncResult.Success) + { + log.Error( $"CheckMeterPrepare_Async( Slot: {genesisSmartReader.GetSlotNr}) - CalFactor2AsyncResult failed. Result: {CalFactor2AsyncResult}"); + return $"Failed to set register {RadioService.TriggerIdle} to {valueTrigerIdle}"; + } + + + log.Debug( $"CheckMeterPrepare_Async( Slot: {genesisSmartReader.GetSlotNr}) - CheckMeterPrepare_Async Result: " + CalFactor2AsyncResult); + + return CalFactor2AsyncResult.Success ? ResultOk : ResultNok; + } + catch (Exception ex) + { + log.Error($"CheckMeterPrepare_Async({genesisHead.GetSlotNr}) - Exception:", ex); + return ex.Message; + } + } + + private static uint ParseRawHexToUInt32(string rawHex, bool littleEndian = false) + { + if (string.IsNullOrWhiteSpace(rawHex)) + throw new FormatException("RawHex is empty."); + + // Remove spaces/tabs/newlines + string cleaned = rawHex.Replace(" ", "") + .Replace("\t", "") + .Replace("\r", "") + .Replace("\n", ""); + + // Must be even number of hex chars + if (cleaned.Length % 2 != 0) + throw new FormatException($"Invalid hex length: {cleaned.Length}"); + + // Max 4 bytes = 8 hex chars + if (cleaned.Length > 8) + throw new FormatException($"Too many bytes for UInt32: '{rawHex}'"); + + byte[] bytes = new byte[cleaned.Length / 2]; + + for (int i = 0; i < bytes.Length; i++) + { + bytes[i] = Convert.ToByte(cleaned.Substring(i * 2, 2), 16); + } + + if (littleEndian) + Array.Reverse(bytes); + + uint value = 0; + + foreach (byte b in bytes) + { + value = (value << 8) | b; + } + + return value; + } + } } \ No newline at end of file diff --git a/TBF/Rig/RegisterReaders/GenesisRegReader/communication/RadioService.cs b/TBF/Rig/RegisterReaders/GenesisRegReader/communication/RadioService.cs index 28d1fa230..78c2d694d 100644 --- a/TBF/Rig/RegisterReaders/GenesisRegReader/communication/RadioService.cs +++ b/TBF/Rig/RegisterReaders/GenesisRegReader/communication/RadioService.cs @@ -1,16 +1,29 @@ using System; using System.Threading; using System.Threading.Tasks; -using GenesisCordonelInterface.API; using log4net; using TBF.Rig.BridgeComponents.GciBridge; +using TBF.Rig.RegisterReaders.GenesisRegReader.common; +using TBF.Rig.RegisterReaders.GenesisRegReader.communication.common; using TBF.Rig.RegisterReaders.GenesisRegReader.implementations; -using TBF.Rig.TestMethods.iPerlCommunication.communication.C4.diagnosticLed; -using TBF.Rig.TestMethods.iPerlCommunication.communication.C4.protocolCommons; +using PublicModels = TBF.Rig.BridgeComponents.GciBridge.Interfaces.PublicModels; namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication { + public class ReadPcbResult + { + public bool IsConnected { get; set; } + + public bool IsLoggedOn { get; set; } + + public bool IsValidPcb { get; set; } + + public string PcbId { get; set; } + + public string Message { get; set; } + } + public class RadioService { private static readonly ILog log = LogManager.GetLogger(typeof(RadioService)); @@ -18,6 +31,8 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication static string okResponse = "Command complete, no errors"; static string errorResponse = "Unable to execute"; + private bool bConnected = false; + private GciBridge _bridge; public RadioService(GciBridge genesisHeadCommInterfaceBridgeComponent) @@ -26,260 +41,492 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication log.Debug("RadioService created with GciBridge= " + genesisHeadCommInterfaceBridgeComponent + ""); } - public async Task ReadRequest_PCBAsyn1(GenesisSmartReader iHead) + private async Task EnsureConnectedAsync( + GenesisSmartReader head, + CancellationToken token = default) { - if (iHead?.CommInterfaceBridge == null) - return null; - - var connectTask = iHead.CommInterfaceBridge.ConnectAsync(iHead.GetSlotNr); - - // Wait either for ConnectAsync or timeout - if (await Task.WhenAny(connectTask, Task.Delay(TimeSpan.FromMinutes(1))) != connectTask) + log.Debug("EnsureConnectedAsync called for iHead: " + head); + if (head?.CommInterfaceBridge == null) { - // Timed out - return null; + return new ReadPcbResult + { + IsConnected = false, + IsLoggedOn = false, + IsValidPcb = false, + Message = "CommInterfaceBridge is null." + }; + } + + var slotInfo = await _bridge.GetSlotAsync(head.GetSlotNr); + if (slotInfo == null || !slotInfo.Success) + { + //just no definet yet ? + log.Debug("EnsureConnectedAsync() - SlotInfo is null."); + } + else if (slotInfo.IsConnected) + { + log.Debug("EnsureConnectedAsync() - Slot: " + slotInfo); + return new ReadPcbResult + { + IsConnected = true, + IsLoggedOn = slotInfo.IsLoggedOn, + IsValidPcb = false, + PcbId = slotInfo.PcbId, + Message = "Already connected." + }; + } + + log.Debug("EnsureConnectedAsync() - Connecting..."); + + var connectTask = head.CommInterfaceBridge.ConnectAsync(head.GetSlotNr, token); + var timeoutTask = Task.Delay(TimeSpan.FromMinutes(1), token); + + var completedTask = await Task.WhenAny(connectTask, timeoutTask); + + if (completedTask != connectTask) + { + return new ReadPcbResult + { + IsConnected = false, + IsLoggedOn = false, + IsValidPcb = false, + Message = "Connect timeout." + }; } var result = await connectTask; - if (result == null || !result.Success || !result.IsConnected) - return null; - - string pcbId = result.PcbId; - - if (!string.IsNullOrEmpty(pcbId)) + if (result == null || !result.Success) { - if (iHead.ConfigStruct != null) - iHead.ConfigStruct.PCBNumberString = pcbId; - - return pcbId; + return new ReadPcbResult + { + IsConnected = false, + IsLoggedOn = false, + IsValidPcb = false, + Message = result == null ? "Connect result is null." : "Connect failed." + }; } - return null; + return new ReadPcbResult + { + IsConnected = result.IsConnected, + IsLoggedOn = false, + IsValidPcb = false, + Message = "Connected OK." + }; } - public async Task ReadRequest_PCBAsync(GenesisSmartReader iHead) + + public async Task FindKeyStone( + string txtPCBId, + CancellationToken token = default) { - log.Debug("ReadRequest_PCB called for iHead: " + iHead); + string pcbId = txtPCBId?.Trim(); - if (iHead?.CommInterfaceBridge == null) - return null; + if (string.IsNullOrWhiteSpace(pcbId)) + throw new Exception("PCB ID is empty."); - using var cts = new CancellationTokenSource(TimeSpan.FromMinutes(1)); + token.ThrowIfCancellationRequested(); - PublicModels.GciConnectResult result; + PublicModels.UdsPasswordResult result = await _bridge.GetPasswordAsync(pcbId, token); - try - { - log.Debug("ReadRequest_PCB() - calling ConnectAsync"); + log.Debug("GetPasswordAsync PCB=" + pcbId + " Result: " + result); - result = await iHead.CommInterfaceBridge - .ConnectAsync(iHead.GetSlotNr, cts.Token) - .ConfigureAwait(false); - - log.Debug("ReadRequest_PCB() - ConnectAsync completed"); - } - catch (OperationCanceledException) - { - log.Debug("ReadRequest_PCB() - ConnectAsync timeout/cancelled"); - return null; - } - catch (Exception ex) - { - log.Error("ReadRequest_PCB() - ConnectAsync failed", ex); - return null; - } - - if (result == null || !result.Success || !result.IsConnected) - { - log.Debug("ReadRequest_PCB() - invalid result: " + result); - return null; - } - - string pcbId = result.PcbId; - - if (string.IsNullOrEmpty(pcbId)) - { - log.Debug("ReadRequest_PCB() - pcbId is empty"); - return null; - } - - if (iHead.ConfigStruct != null) - { - iHead.ConfigStruct.PCBNumberString = pcbId; - log.Debug("ReadRequest_PCB() - PCBNumberString: " + pcbId); - } - - return pcbId; + return result; } - public string ReadRequest_PCB(ref GenesisSmartReader iHead) + public async Task LoginByPasswordAsync( + int slotId, string txtPassword, + CancellationToken token = default) { - var head = iHead; // <-- copy to local (no longer ref) + if (string.IsNullOrWhiteSpace(txtPassword)) + throw new Exception("LoginByPasswordAsync() - PASSWORD is empty."); + token.ThrowIfCancellationRequested(); + + log.Debug($"LoginByPasswordAsync( Slot: {slotId}) - set password to: " + txtPassword.Substring(0, 4) + "************"); + var gciSetPasswordResult = await _bridge.SetPasswordAsync(slotId,txtPassword, token); + log.Debug($"LoginByPasswordAsync( Slot: {slotId}) - SetPasswordAsync Result: " + gciSetPasswordResult); + + // LOGIN + log.Debug($"LoginByPasswordAsync( Slot: {slotId}) - START LOGIN"); + var gciSlotInfo = await _bridge.GetSlotAsync(slotId); + log.Debug($"LoginByPasswordAsync( Checked before Login() Slot: {slotId}) - START LOGIN Slot: {gciSlotInfo}"); + GenesisCordonelInterface.API.PublicModels.GciLoginResult result = await _bridge.LoginAsync(slotId, token); + log.Debug($"LoginByPasswordAsync( Slot: {slotId}) Result: " + result); + log.Debug($"LoginByPasswordAsync( Slot: {slotId}) - END LOGIN, Success: {result.Success}"); + // ~ LOGIN + return result; + } + + public async Task ReadRequest_PCBAsync( GenesisSmartReader head, bool bReload = false) + { log.Debug("ReadRequest_PCB called for iHead: " + head); if (head?.CommInterfaceBridge == null) - return null; + { + return new ReadPcbResult + { + IsConnected = false, + IsValidPcb = false, + Message = "CommInterfaceBridge is null." + }; + } try { - var connectTask = Task.Run(async () => - await head.CommInterfaceBridge.ConnectAsync(head.GetSlotNr) - ); + // CONNECT ONLY IF NEEDED + var connectResult = await EnsureConnectedAsync(head); - var completedTask = Task.WhenAny( - connectTask, - Task.Delay(TimeSpan.FromMinutes(1)) - ).GetAwaiter().GetResult(); - - if (completedTask != connectTask) + if (!connectResult.IsConnected) { - log.Debug("ReadRequest_PCB() - Timeout happened"); - return null; + return connectResult; } - var result = connectTask.GetAwaiter().GetResult(); - log.Debug("ReadRequest_PCB() - Result: " + result); + log.Debug($"ReadRequest_PCB() connect - {connectResult.Message}"); - if (result == null || !result.Success || !result.IsConnected) - return null; - - var pcbId = result.PcbId; - log.Debug("Result pcbId: " + pcbId); - - if (!string.IsNullOrEmpty(pcbId) && head.ConfigStruct != null) + //Check if exist PCB + if (!bReload) { - head.ConfigStruct.PCBNumberString = pcbId; - log.Debug("Result set to ConfigStruct.PCBNumberString = " + head.ConfigStruct.PCBNumberString); + var gciSlotInfo = await head.CommInterfaceBridge.GetSlotAsync(head.GetSlotNr); + + if (gciSlotInfo == null && gciSlotInfo.Success && string.IsNullOrEmpty(gciSlotInfo.PcbId)) + { + log.Debug( + $"BuildConnection() - SlotNr: {head.GetSlotNr} already exist PCB: {gciSlotInfo.PcbId}"); + return new ReadPcbResult + { + IsConnected = gciSlotInfo.IsConnected, + IsValidPcb = true, + PcbId = gciSlotInfo.PcbId, + Message = "PCB already exist." + }; + } } - return pcbId; + // PCB READ LOOP + string validPcbId = null; + int maxAttempts = 5; + DateTime startTime = DateTime.UtcNow; + TimeSpan maxDuration = TimeSpan.FromSeconds(30); + + //LOOP + for (int attempt = 1; attempt <= maxAttempts; attempt++) + { + if (DateTime.UtcNow - startTime > maxDuration) + { + log.Debug($"ReadRequest_PCB({head.GetSlotNr}) - PCB max duration exceeded"); + break; + } + + log.Debug($"ReadRequest_PCB({head.GetSlotNr}) - PCB attempt {attempt}/{maxAttempts}"); + var pcbTask = head.CommInterfaceBridge.GetPcbIdAsync(head.GetSlotNr); + var timeoutTaskPcb = Task.Delay(TimeSpan.FromSeconds(5)); + var completedTaskPcb = await Task.WhenAny(pcbTask, timeoutTaskPcb); + + if (completedTaskPcb != pcbTask) + { + log.Debug($"ReadRequest_PCB() PCB attempt {attempt} - Timeout"); + continue; + } + + var resultPCB = await pcbTask; + + // VALIDATION BLOCK + { + if (resultPCB == null) + { + log.Debug($"ReadRequest_PCB({head.GetSlotNr}) PCB attempt {attempt} - result is null"); + continue; + } + + if (!resultPCB.Success) + { + log.Debug($"ReadRequest_PCB({head.GetSlotNr}) PCB attempt {attempt} - Success=false"); + continue; + } + + string pcbId = resultPCB.PcbId; + + if (string.IsNullOrWhiteSpace(pcbId)) + { + log.Debug($"ReadRequest_PCB({head.GetSlotNr}) PCB attempt {attempt} - PCB empty"); + continue; + } + + pcbId = pcbId.Trim(); + + if (pcbId.Length != 9) + { + log.Debug( $"ReadRequest_PCB({head.GetSlotNr}) PCB attempt {attempt} - Invalid PCB length: '{pcbId}', len={pcbId.Length}"); + continue; + } + + validPcbId = pcbId; + log.Debug($"ReadRequest_PCB({head.GetSlotNr}) PCB valid: {validPcbId}"); + break; + } + } + + if (string.IsNullOrEmpty(validPcbId)) + { + return new ReadPcbResult + { + IsConnected = connectResult.IsConnected, + IsValidPcb = false, + PcbId = null, + Message = "Valid PCB not found." + }; + } + + if (head.ConfigStruct != null) + { + head.ConfigStruct.PCBNumberString = validPcbId; + } + + return new ReadPcbResult + { + IsConnected = connectResult.IsConnected, + IsValidPcb = true, + PcbId = validPcbId, + Message = "PCB OK" + }; } catch (Exception ex) { - log.Error("ReadRequest_PCB() failed", ex); - return null; - } - } + log.Error("ReadRequest_PCBAsync() failed", ex); - public string ReadRequest_PCB2(ref GenesisSmartReader iHead) - { - return ReadRequest_PCBAsync(iHead).GetAwaiter().GetResult(); - } - - public string ReadRequest_PCB1(ref GenesisSmartReader iHead) - { - log.Debug("ReadRequest_PCB called for iHead: " + iHead.ToString()); - if (iHead?.CommInterfaceBridge == null) - return null; - - // -- connection -- - var connectTask = iHead.CommInterfaceBridge.ConnectAsync(iHead.GetSlotNr); - log.Debug("ReadRequest_PCB() - ConnectAsync created, Now waiting for result"); - - var completedTask = Task.WhenAny( - connectTask, - Task.Delay(TimeSpan.FromMinutes(1)) - ).GetAwaiter().GetResult(); - - log.Debug("ReadRequest_PCB() - CompletedTask: " + completedTask); - - // Timeout happened - if (completedTask != connectTask) - { - log.Debug("ReadRequest_PCB() - Timeout happened"); - return null; - } - - var result = connectTask.GetAwaiter().GetResult(); - log.Debug("ReadRequest_PCB() - ConnectAsync completed"); - - if (result == null || !result.Success || !result.IsConnected) - return null; - log.Debug("ReadRequest_PCB() - result: " + result); - //~ -- connection -- - - string pcbId = result.PcbId; - log.Debug("ReadRequest_PCB() - pcbId: " + pcbId); - - if (!string.IsNullOrEmpty(pcbId)) - { - if (iHead.ConfigStruct != null) + return new ReadPcbResult { - iHead.ConfigStruct.PCBNumberString = pcbId; - log.Debug("ReadRequest_PCB() - iHead.ConfigStruct.PCBNumberString: " + - iHead.ConfigStruct.PCBNumberString); + IsConnected = false, + IsValidPcb = false, + PcbId = null, + Message = ex.Message + }; + } + } + + public async Task PrepareLoginAdnConnect_Async( + GenesisSmartReader iHead, + bool isConnected, + CancellationToken token = default) + { + log.Debug("PrepareLoginAdnConnect_Async called for iHead: " + iHead + " isConnected: " + isConnected); + + if (iHead?.CommInterfaceBridge == null) + return false; + + try + { + token.ThrowIfCancellationRequested(); + + var connectResult = await EnsureConnectedAsync(iHead, token); + + if (!connectResult.IsConnected) + return false; + log.Debug($"PrepareLoginAdnConnect_Async() connect - {connectResult.Message}"); + + if (connectResult.IsLoggedOn) + return true; + + //get stored PCB - Keystone + log.Debug("Have we PCB stored?"); + string pcb = iHead.ConfigStruct?.PCBNumberString; + + if (string.IsNullOrWhiteSpace(pcb)) + { + pcb = connectResult.PcbId; + if (string.IsNullOrWhiteSpace(pcb)) + { + pcb = iHead.SerialNr; + } + //GET PCB FROM Meter + if (string.IsNullOrWhiteSpace(pcb)) + { + log.Debug("PrepareLoginAdnConnect_Async() No PCB stored. Trying to get PCB from Meter"); + var pcbResult = await ReadRequest_PCBAsync(iHead); + if (pcbResult.IsValidPcb) + { + pcb = pcbResult.PcbId; + iHead.SerialNr = pcb; + if (iHead.ConfigStruct != null) + { + iHead.ConfigStruct.PCBNumberString = pcb; + } + } + } } - return pcbId; + if (string.IsNullOrWhiteSpace(pcb)) + { + log.Debug("PrepareLoginAdnConnect_Async() No PCB stored. MISSING PCB!!!!!"); + return false; + } + + log.Debug( $"PrepareLoginAdnConnect_Async() Start Find Keystone Slot: {iHead.GetSlotNr} PCB:{iHead.SerialNr} Calib PCB:{pcb} - find keystone"); + + var keyStoneResult = await FindKeyStone(pcb, token); + + if (keyStoneResult == null || !keyStoneResult.Success) + return false; + + //LOGIN + + log.Debug( $"PrepareLoginAdnConnect_Async() Start Login Slot: {iHead.GetSlotNr} PCB:{iHead.SerialNr} Calib PCB:{pcb} - login"); + GenesisCordonelInterface.API.PublicModels.GciLoginResult loginByPasswordAsync = + await LoginByPasswordAsync(iHead.GetSlotNr, keyStoneResult.Password, token); + + if (loginByPasswordAsync == null || !loginByPasswordAsync.Success) + { + return false; + } + + log.Debug($"PrepareLoginAdnConnect_Async() Login OK"); + return true; } - - log.Debug("ReadRequest_PCB() - pcbId is empty"); - return null; - } - - public ProtocolStatuses GetActivityStatusMode(GenesisSmartReader iHead) - { - if (iHead?.CommInterfaceBridge == null) - return ProtocolStatuses.Unknown; - - var connectResult = iHead.CommInterfaceBridge - .ConnectAsync(iHead.GetSlotNr) - .GetAwaiter() - .GetResult(); - - if (connectResult == null || !connectResult.Success || !connectResult.IsConnected) - return ProtocolStatuses.Unknown; - - var pcbResult = iHead.CommInterfaceBridge - .GetPcbIdAsync(iHead.GetSlotNr) - .GetAwaiter() - .GetResult(); - - if (pcbResult == null || !pcbResult.Success || string.IsNullOrWhiteSpace(pcbResult.PcbId)) - return ProtocolStatuses.Unknown; - - if (iHead.ConfigStruct != null) + catch (OperationCanceledException) { - iHead.ConfigStruct.PCBNumberString = pcbResult.PcbId; + log.Debug("PrepareLoginAdnConnect_Async() canceled."); + return false; } - - return ProtocolStatuses.Active; } - public DiagnosticLedState SetOptoStatusMode(GenesisSmartReader iHead, DiagnosticLedState opthoStatusMode) + public static readonly String LedMode = "GENESISFLOW_LedMode"; + public static readonly String SampleRate = "GENESISFLOW_SampleRate"; + public static readonly String CalFactor1 = "GENESISFLOW_CalFactor1"; + public static readonly String CalFactor2 = "GENESISFLOW_CalFactor2"; + public static readonly String CalFactor3 = "GENESISFLOW_CalFactor3"; + public static readonly String ResetAccumulators = "GENESISFLOW_ResetAccumulators"; + public static readonly String ForwardArrow = "GENESISFLOW_ForwardArrow"; + public static readonly String StoreCalibration = "GENESISFLOW_StoreCalibration"; + public static readonly String TriggerIdle = "GENESISFLOW_TriggerIdle"; + public static readonly String MeterSize = "GENESISFLOW_MeterSize"; + + public async Task GetActivityLedStatusMode_Async( + GenesisSmartReader iHead, + bool isConnected, + CancellationToken token = default) { + log.Debug("GetActivityLedStatusMode_Async called for iHead: " + iHead + " isConnected: " + isConnected); + if (iHead?.CommInterfaceBridge == null) - return DiagnosticLedState.StatusUnknown; + return LedState.Unknown; - var connectResult = iHead.CommInterfaceBridge - .ConnectAsync(iHead.GetSlotNr) - .GetAwaiter() - .GetResult(); - - if (connectResult == null || !connectResult.Success || !connectResult.IsConnected) - return DiagnosticLedState.StatusUnknown; - - //SetDiagnosticLEDState - - var pcbResult = iHead.CommInterfaceBridge - .GetPcbIdAsync(iHead.GetSlotNr) - .GetAwaiter() - .GetResult(); - - if (pcbResult == null || !pcbResult.Success || string.IsNullOrWhiteSpace(pcbResult.PcbId)) - return DiagnosticLedState.StatusUnknown; - - if (iHead.ConfigStruct != null) + try { - iHead.ConfigStruct.PCBNumberString = pcbResult.PcbId; + var loginAdnConnectAsync = await PrepareLoginAdnConnect_Async(iHead, isConnected, token); + + if (!loginAdnConnectAsync) + return LedState.Unknown; + + //Get Activity Status + + var registerReadResult = + await _bridge.ReadRegisterWithRetryAsync(iHead.GetSlotNr,LedMode, token); + + if (registerReadResult == null || !registerReadResult.Success) + { + return LedState.Unknown; + } + log.Debug($"GetActivityStatusMode() Read Register OK Response: {registerReadResult}"); + try + { + byte[] bytes = HexFormatter.HexStringToByteArray(registerReadResult.Result.RawHex); + //Convert byte array to int + if (bytes == null || bytes.Length < 4) + { + log.Debug("Invalid byte array length"); + return LedState.Unknown; + } + + int value = BitConverter.ToInt32(bytes, 0); + + // continue your real status logic here... + return value == 6 ? LedState.active : LedState.inactive; + }catch(Exception ex) + { + log.Error("GetActivityStatusMode() failed", ex); + return LedState.Unknown; + } + } + catch (OperationCanceledException) + { + log.Debug("GetActivityLedStatusMode_Async() canceled."); + return LedState.Unknown; + } + catch (Exception ex) + { + log.Error("GetActivityLedStatusMode_Async() failed", ex); + return LedState.Unknown; } - - - return DiagnosticLedState.StatusUnknown; } + public async Task SetLedMode_Async(GenesisSmartReader iHead, LedState ledMode, bool isConnected, + CancellationToken token = default) + { + log.Debug("SetLedMode_Async called for iHead: " + iHead + " isConnected: " + isConnected); + if (iHead?.CommInterfaceBridge == null) + return false; + + try + { + var loginAdnConnectAsync = await PrepareLoginAdnConnect_Async(iHead, isConnected, token); + + if (!loginAdnConnectAsync) + return false; + + //Get Activity Status + byte valueLed = (ledMode == LedState.active) ? (byte)6 : (byte)0; + log.Debug($"SetLedMode_Async() Set Led Mode: {valueLed}"); + var registerWriteResult = + await _bridge.WriteRegisterAsync(iHead.GetSlotNr, LedMode, valueLed, false, false, token); + + if (registerWriteResult == null || !registerWriteResult.Success) + { + return false; + } + + + log.Debug($"SetLedMode_Async() Write Register OK Response: {registerWriteResult}"); + return true; + } + catch (OperationCanceledException) + { + log.Debug("GetActivityLedStatusMode_Async() canceled."); + return false; + } + catch (Exception ex) + { + log.Error("GetActivityLedStatusMode_Async() failed", ex); + return false; + } + finally + { + log.Debug("SetLedMode_Async() - End - DO DISCONNECT"); + var gciDisconnectResult = await _bridge.DisconnectAsync(iHead.GetSlotNr); + log.Debug($"SetLedMode_Async() Disconnect Result: {gciDisconnectResult}"); + } + } + + public async Task Disconnect_Async(GenesisSmartReader iHead) + { + try + { + log.Debug("Disconnect_Async() - Start"); + var gciSlotInfo = await _bridge.GetSlotAsync(iHead.GetSlotNr); + log.Debug($"Disconnect_Async() - Slot: {iHead.GetSlotNr} - SlotInfo: {gciSlotInfo}"); + log.Debug("Disconnect_Async() - DO DISCONNECT"); + var gciDisconnectResult = await _bridge.DisconnectAsync(iHead.GetSlotNr); + log.Debug($"Disconnect_Async() Disconnect Result: {gciDisconnectResult}"); + + return gciDisconnectResult.Success; + }catch(Exception ex) + { + log.Error("Disconnect_Async() failed", ex); + return false; + } + + } private static ushort SafeIntToUShort(int value) { @@ -316,29 +563,41 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication } - public bool SetActivityMode_Active(GenesisSmartReader iHead) + public async Task SetActivityMode_Active(GenesisSmartReader iHead, + bool isConnected, CancellationToken token = default) { + log.Debug("SetActivityMode_Active called for iHead: " + iHead + " isConnected: " + isConnected); + if (iHead?.CommInterfaceBridge == null) return false; - var connectResult = iHead.CommInterfaceBridge - .ConnectAsync(iHead.GetSlotNr) - .GetAwaiter() - .GetResult(); + try + { + token.ThrowIfCancellationRequested(); - if (connectResult == null || !connectResult.Success || !connectResult.IsConnected) + var connectResult = await EnsureConnectedAsync(iHead, token); + + if (!connectResult.IsConnected) + return false; + + isConnected = connectResult.IsConnected; + + log.Debug($"SetActivityMode_Active() connect - {connectResult.Message}"); + + //Set LED to state 4 + // string version = _bridge?.GciExternalInterface?.GetPcbId(iHead.GetSlotNr); + // if (!string.IsNullOrEmpty(version)) + // { + // if (iHead.ConfigStruct != null) // store mechanism + // { + // iHead.ConfigStruct.Version = version; + // } + // return true; + // } + }catch(OperationCanceledException) + { return false; - - //Set LED to state 4 - // string version = _bridge?.GciExternalInterface?.GetPcbId(iHead.GetSlotNr); - // if (!string.IsNullOrEmpty(version)) - // { - // if (iHead.ConfigStruct != null) // store mechanism - // { - // iHead.ConfigStruct.Version = version; - // } - // return true; - // } + } return false; } diff --git a/TBF/Rig/RegisterReaders/GenesisRegReader/communication/common/LedState.cs b/TBF/Rig/RegisterReaders/GenesisRegReader/communication/common/LedState.cs new file mode 100644 index 000000000..579315d32 --- /dev/null +++ b/TBF/Rig/RegisterReaders/GenesisRegReader/communication/common/LedState.cs @@ -0,0 +1,9 @@ +namespace TBF.Rig.RegisterReaders.GenesisRegReader.communication.common +{ + public enum LedState : int + { + Unknown = -1, + inactive = 0, + active = 1, + } +} diff --git a/TBF/Rig/RegisterReaders/GenesisRegReader/implementations/GenesisImplHeadTestCtrl.cs b/TBF/Rig/RegisterReaders/GenesisRegReader/implementations/GenesisImplHeadTestCtrl.cs index 93192875f..c3fb7e2dc 100644 --- a/TBF/Rig/RegisterReaders/GenesisRegReader/implementations/GenesisImplHeadTestCtrl.cs +++ b/TBF/Rig/RegisterReaders/GenesisRegReader/implementations/GenesisImplHeadTestCtrl.cs @@ -40,6 +40,11 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations public void Destroy() { + if(Head != null && Head.OptoHeadTest != null) + { + Head.OptoHeadTest.CloseConnection(); + } + stopWorkerThread = true; if (optoThread != null) { diff --git a/TBF/Rig/RegisterReaders/GenesisRegReader/implementations/GenesisSmartReader.cs b/TBF/Rig/RegisterReaders/GenesisRegReader/implementations/GenesisSmartReader.cs index 90873ab34..76e905cd5 100644 --- a/TBF/Rig/RegisterReaders/GenesisRegReader/implementations/GenesisSmartReader.cs +++ b/TBF/Rig/RegisterReaders/GenesisRegReader/implementations/GenesisSmartReader.cs @@ -216,6 +216,8 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations } + public int ChannelsCount { get => iChanelsCount; } + private static int iChanelsCount = 3; private int firstChanel; @@ -1339,16 +1341,6 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations void DataStreamPostProcessing() { PrepareCalculatedChannelData(); - try - { - log.DebugFormat("DataStreamPostProcessing() - harcoded call GetQ3Calibration(200.0, 120.0, 15625.0);"); - SetQ3Calibration(new double[]{15625.0,15625.0,15625.0 }); - CalculateQ3Calibration(200.0, 120.0); - } - catch (Exception ex) - { - log.Error($"DataStreamPostProcessing -- Q3 CALIBRATION -- failed: {ex}"); - } } /// @@ -1882,7 +1874,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations _readLoopTask = Task.Run(() => { - log.Debug($"OPTHO {OptoComPortNr} background read loop started."); + logStream.Debug($"OPTHO {OptoComPortNr} background read loop started."); while (!token.IsCancellationRequested) { @@ -1938,12 +1930,12 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations } catch (Exception ex) { - log.Error($"OPTHO {OptoComPortNr} background read error: {ex.Message}"); + logStream.Error($"OPTHO {OptoComPortNr} background read error: {ex.Message}"); Thread.Sleep(100); } } - log.Debug($"OPTHO {OptoComPortNr} background read loop stopped."); + logStream.Debug($"OPTHO {OptoComPortNr} background read loop stopped."); }, token); } @@ -2024,7 +2016,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations { try { - log.Debug($"OPTHO {OptoComPortNr} processing loop started."); + logStream.Debug($"OPTHO {OptoComPortNr} processing loop started."); while (!token.IsCancellationRequested) { @@ -2054,14 +2046,14 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations if (blockCompleted) { - log.Debug("Processing loop completed flow block detected."); + logStream.Debug("Processing loop completed flow block detected."); if (resetSerialBuffersOnCompletedFlowBlock) ResetDataBuffer(); } } catch (Exception ex) { - log.Error($"Processing loop failed: {ex}"); + logStream.Error($"Processing loop failed: {ex}"); } continue; @@ -2075,16 +2067,16 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations } catch (Exception ex) { - log.Error($"OPTHO {OptoComPortNr} processing loop error: {ex}"); + logStream.Error($"OPTHO {OptoComPortNr} processing loop error: {ex}"); Thread.Sleep(50); } } - log.Debug($"OPTHO {OptoComPortNr} processing loop stopped."); + logStream.Debug($"OPTHO {OptoComPortNr} processing loop stopped."); } catch (Exception ex) { - log.Error($"StartProcessingLoop fatal error: {ex}"); + logStream.Error($"StartProcessingLoop fatal error: {ex}"); } }, token); } @@ -2113,13 +2105,13 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations // 🔴 STEP 1: Check if we should start processing if (startDataProcessing && optoState == DataStreamState.ProcessAndSave) { - log.DebugFormat("Read Opto Data Line timestamp:{0} to process from queue: {1}",timestamp.ToString("HH:mm:ss.fff") , line); + logStream.DebugFormat("Read Opto Data Line timestamp:{0} to process from queue: {1}",timestamp.ToString("HH:mm:ss.fff") , line); bool blockCompleted; ProcessOptoLine(line, optoState, out blockCompleted); if (blockCompleted) { - log.Debug("ReadOptoData() completed flow block detected."); + logStream.Debug("ReadOptoData() completed flow block detected."); if (resetSerialBuffersOnCompletedFlowBlock) // DO NOT call ResetDataBuffer() here ResetDataBuffer(); } @@ -2127,7 +2119,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations } catch (Exception ex) { - log.Error($"OPTHO {OptoComPortNr} processing queued line failed: {ex.Message}"); + logStream.Error($"OPTHO {OptoComPortNr} processing queued line failed: {ex.Message}"); } } } @@ -2154,14 +2146,14 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations if (streamingDecode.DataFlowTest != null && streamingDecode.DataFlowTest.IsValid) { blockCompleted = HandleFlowMarker(); - log.Debug("ComPort: " + OptoComPortNr + " Decoded Flow data: " + streamingDecode.DataFlowTest + - " OPTHO RX ← " + HexFormatter.ToSerialHex(bytes)); + logStream.Debug("ComPort: " + OptoComPortNr + " Decoded Flow data: " + streamingDecode.DataFlowTest + + " OPTHO RX ← " + HexFormatter.ToSerialHex(bytes)); } if (calibData != null && calibData.IsValid) { - log.Debug("ComPort: " + OptoComPortNr + " Decoded Calib: " + calibData + " OPTHO RX ← " + - HexFormatter.ToSerialHex(bytes)); + logStream.Debug("ComPort: " + OptoComPortNr + " Decoded Calib: " + calibData + " OPTHO RX ← " + + HexFormatter.ToSerialHex(bytes)); MarkCalibrationChannelSeen(calibData.Channel); } @@ -2181,7 +2173,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations if (optoData[bufferIx] == null) { - log.ErrorFormat("{0}: optoData[{1}] was null, recreating.", Name, bufferIx); + logStream.ErrorFormat("{0}: optoData[{1}] was null, recreating.", Name, bufferIx); optoData[bufferIx] = new OptoTelegramRaw(); } @@ -2194,7 +2186,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations int iChanel = calibData.Channel - 1; if (iChanel >= 0 && iChanel < iChanelsCount) { - log.Debug( + logStream.Debug( $"Before UpdateFromSmart ch={iChanel + 1}: " + $"volumeRawExtLast={volumeRawExtLast[iChanel]}, " + $"timestampExtLast={timestampExtLast[iChanel]}, " + @@ -2262,7 +2254,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations var encoding = optoSerialPort?.Encoding ?? Encoding.ASCII; byte[] bytes = encoding.GetBytes(line); received = HexFormatter.ToSerialHex(bytes); - log.Debug("RX ← " + received); + logStream.Debug("RX ← " + received); try { @@ -2271,19 +2263,19 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations CalibrationRecord data = _streamingDecode.DataCalib; if (data != null && data.IsValid) { - log.Info($"OPTHO {OptoComPortNr} DataCalib Parsed opto data: " + data + " RX ← " + - received); + logStream.Info($"OPTHO {OptoComPortNr} DataCalib Parsed opto data: " + data + " RX ← " + + received); MarkCalibrationChannelSeen(data.Channel); } FlowTestRecord dataFlow = _streamingDecode.DataFlowTest; if (dataFlow != null && dataFlow.IsValid) { - log.Info($"OPTHO {OptoComPortNr} FLOW Parsed opto data: " + dataFlow + " RX ← " + received); + logStream.Info($"OPTHO {OptoComPortNr} FLOW Parsed opto data: " + dataFlow + " RX ← " + received); if (HandleFlowMarker()) { - log.Debug("ReadOptoData() completed flow block detected."); + logStream.Debug("ReadOptoData() completed flow block detected."); if (resetSerialBuffersOnCompletedFlowBlock) ResetDataBuffer(); // no ResetDataBuffer() here } @@ -2292,7 +2284,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations } catch (Exception ex) { - log.Error($"OPTHO {OptoComPortNr} Read error: {ex.Message}"); + logStream.Error($"OPTHO {OptoComPortNr} Read error: {ex.Message}"); } // string line = optoSerialPort.ReadExisting(); @@ -2337,11 +2329,11 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations } catch (TimeoutException) { - log.Debug($"ReadOptoData() OPTHO {OptoComPortNr} timeout - continuing."); + logStream.Debug($"ReadOptoData() OPTHO {OptoComPortNr} timeout - continuing."); } catch (Exception ex) { - log.Error($"ReadOptoData() OPTHO {OptoComPortNr} Read error: {ex.Message}"); + logStream.Error($"ReadOptoData() OPTHO {OptoComPortNr} Read error: {ex.Message}"); } } @@ -2357,11 +2349,11 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations { optoSerialPort.DiscardInBuffer(); optoSerialPort.DiscardOutBuffer(); - log.Debug("-- Reaset Data Buffer --"); + logStream.Debug("-- Reaset Data Buffer --"); return; } } - log.Debug("-- Reaset Data Buffer - no serial port --"); + logStream.Debug("-- Reaset Data Buffer - no serial port --"); } void ISmartReader.SetNfcInterface() @@ -2387,17 +2379,17 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations byte[] bytes = optoSerialPort.Encoding.GetBytes(line); string received = HexFormatter.ToSerialHex(bytes); - log.Debug("RX ← " + received); + logStream.Debug("RX ← " + received); return line; } } catch (TimeoutException) { - log.Debug($"ReadOptoData() OPTHO {OptoComPortNr} ReadLine timeout (3s) - continuing."); + logStream.Debug($"ReadOptoData() OPTHO {OptoComPortNr} ReadLine timeout (3s) - continuing."); } catch (Exception ex) { - log.Error($"ReadOptoData() OPTHO {OptoComPortNr} Read error: {ex.Message}"); + logStream.Error($"ReadOptoData() OPTHO {OptoComPortNr} Read error: {ex.Message}"); } return string.Empty; @@ -2408,7 +2400,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations if (completedTask == readTask) return await readTask; - log.Debug("ReadOptoData timeout after " + timeoutMs + " ms"); + logStream.Debug("ReadOptoData timeout after " + timeoutMs + " ms"); return string.Empty; } @@ -2960,7 +2952,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations if (data == null || !data.IsValid) continue; - log.Info($"OPTHO {OptoComPortNr} Parsed optho data:" + data); + logStream.Info($"OPTHO {OptoComPortNr} Parsed optho data:" + data); int dch = data.Channel - 1; if (dch >= 0 && dch < iChanelsCount) @@ -2973,7 +2965,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations } catch (Exception ex) { - log.Warn($"Parsing DiagnosticLedState4Data: {ex.Message}"); + logStream.Warn($"Parsing DiagnosticLedState4Data: {ex.Message}"); } } } @@ -2984,7 +2976,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations } - log.Debug($"Try get End Volume! COM: {this.OptoComPortNr}, Volume: {volumeLtr}"); + logStream.Debug($"Try get End Volume! COM: {this.OptoComPortNr}, Volume: {volumeLtr}"); if (optoSerialPort != null && optoSerialPort.IsOpen) CloseOptoSerialPort(); if (!Double.IsNaN(volumeLtr[ch])) @@ -2995,12 +2987,12 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations //Solve roll over if (endWMState < beginWMState) { - log.Debug($"Solve roll over! endWMState: {endWMState} < beginWMState: {beginWMState}"); + logStream.Debug($"Solve roll over! endWMState: {endWMState} < beginWMState: {beginWMState}"); const double VOL_RANGE_LITERS = 16777216.0 * 0.00025; // 4,194.304 l endWMState += VOL_RANGE_LITERS; volumeLtr[ch] = endWMState; ReadPulses(); - log.Debug( + logStream.Debug( $"Solve roll over! Upgraded endWMState: {endWMState}, beginWMState: {beginWMState}"); } } @@ -3009,7 +3001,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations } //} - log.Warn("Default NaN value returned! Data Opto stream reading failed!"); + logStream.Warn("Default NaN value returned! Data Opto stream reading failed!"); return Double.NaN; }).ConfigureAwait(false); } @@ -3019,14 +3011,14 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations { if (ConfigStruct == null) { - log.Debug("ConfigStruct is null - created new in ReadSerialNr()"); + logStream.Debug("ConfigStruct is null - created new in ReadSerialNr()"); ConfigStruct = new ConfigStruct(); } return await Task.Run(() => { - log.Debug($"Try get Start Volume! COM: {this.OptoComPortNr}"); + logStream.Debug($"Try get Start Volume! COM: {this.OptoComPortNr}"); Start(); @@ -3050,7 +3042,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations StreamingDecoder _streamingDecode = new StreamingDecoder(true); _streamingDecode.DecodeMsg(readOptoDataWithTimeout); CalibrationRecord data = _streamingDecode.DataCalib; - log.Info($"OPTHO {OptoComPortNr} Parsed optho data:" + data); + logStream.Info($"OPTHO {OptoComPortNr} Parsed optho data:" + data); if (data == null || !data.IsValid) continue; @@ -3066,7 +3058,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations } catch (Exception ex) { - log.Warn($"Parsing DiagnosticLedState4Data: {ex.Message}"); + logStream.Warn($"Parsing DiagnosticLedState4Data: {ex.Message}"); } } } @@ -3076,7 +3068,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations } } - log.Debug($"Try get Start Volume! COM: {this.OptoComPortNr}, Volume: {volumeLtr0}"); + logStream.Debug($"Try get Start Volume! COM: {this.OptoComPortNr}, Volume: {volumeLtr0}"); if (optoSerialPort != null && optoSerialPort.IsOpen) CloseOptoSerialPort(); if (!Double.IsNaN(volumeLtr0[ch])) @@ -3087,7 +3079,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations } //} - log.Warn("Default NaN value returned! Data Opto stream reading failed!"); + logStream.Warn("Default NaN value returned! Data Opto stream reading failed!"); return Double.NaN; }).ConfigureAwait(false); } @@ -3099,7 +3091,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations if (ConfigStruct == null) { - log.Debug("ConfigStruct is null - created new in ReadSerialNr()"); + logStream.Debug("ConfigStruct is null - created new in ReadSerialNr()"); ConfigStruct = new ConfigStruct(); } @@ -3109,11 +3101,11 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations return await Task.Run(() => { - log.Debug($"Try get ReadSerialNr! COM: {this.RfidComPortNr}"); + logStream.Debug($"Try get ReadSerialNr! COM: {this.RfidComPortNr}"); SerialNr = OptoHeadTest.ReadRequest_PCB(); if (string.IsNullOrEmpty(SerialNr)) { - log.Debug("ReadSerialNr successful"); + logStream.Debug("ReadSerialNr successful"); } //optoHeadTest.CloseConnection(); @@ -3898,7 +3890,8 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations _startupFlushActive = false; log.WarnFormat( - "Startup flush finished. Ignored {0} incoming opto lines.", + "Startup flush finished. ({0}) Ignored {1} incoming opto lines.", + Name, _startupFlushIgnoredLines); } } @@ -3915,7 +3908,8 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations _startupFlushActive = false; log.WarnFormat( - "Startup flush finished. Ignored {0} incoming opto lines. Window: {1:HH:mm:ss.fff} - {2:HH:mm:ss.fff}", + "Startup flush finished. ({0}) Ignored {1} incoming opto lines. Window: {2:HH:mm:ss.fff} - {3:HH:mm:ss.fff}", + Name, _startupFlushIgnoredLines, _startupFlushFirstIgnoredUtc, _startupFlushLastIgnoredUtc); @@ -3937,6 +3931,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations private double[] q3CalibInitial = {Double.NaN,Double.NaN,Double.NaN}; private bool[] isChQ3CalibValid = { false,false,false}; private double[] q3CalibCh = {Double.NaN,Double.NaN,Double.NaN}; + private double[] q3DiffPercentageCalibCh = {Double.NaN,Double.NaN,Double.NaN}; public bool Q3CalibValid @@ -3954,6 +3949,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations } public double[] Q3CalibValue { get => q3CalibInitial; } + public double[] Q3CalibDiffPercentageValue { get => q3DiffPercentageCalibCh; } public bool Q3Calib_Ch1Valid { get => isChQ3CalibValid[0]; } public bool Q3Calib_Ch2Valid { get => isChQ3CalibValid[1]; } @@ -3964,14 +3960,48 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations public int GetSlotNr { get => genesisHeadCfg?.SlotNr ?? -1; } - void SetQ3Calibration(double[] q3CalibInitial) { this.q3CalibInitial = q3CalibInitial; } + //TODO BUMI implement variable values for Q3Channel! + public void SetQ3Calibration(double[] q3CalibInitial) + { + if (q3CalibInitial == null || q3CalibInitial.Length != 3 || + Array.Exists(q3CalibInitial, x => double.IsNaN(x) || double.IsInfinity(x) || x < 1 || x > ushort.MaxValue)) + throw new ArgumentException("Three valid Genesis calibration factors are required.", nameof(q3CalibInitial)); + this.q3CalibInitial = (double[])q3CalibInitial.Clone(); + refVolume = double.NaN; + refTime = double.NaN; + Array.Clear(isChQ3CalibValid, 0, isChQ3CalibValid.Length); + } + + private double refVolume = double.NaN; + private double refTime = double.NaN; + public double RefVolume { get => refVolume; set => refVolume = value; } + public double RefTime { get => refTime; set => refTime = value; } + + + public bool CalculateQ3Calibration() + { + if (Double.IsNaN(refVolume) || Double.IsInfinity(refVolume) || refVolume <= 0 || Double.IsNaN(refTime) || Double.IsInfinity(refTime) || refTime <= 0) + { + log.Debug("RefVolume or RefTime is NaN"); + return false; + } + + CalculateQ3Calibration( refVolume, refTime); + return true; + } public void CalculateQ3Calibration(double refVolume, double refTime) { - GetQ3Calibration(refVolume, refTime, q3CalibInitial, ref isChQ3CalibValid, ref q3CalibCh); + GetQ3Calibration(refVolume, refTime, q3CalibInitial, ref isChQ3CalibValid,ref q3DiffPercentageCalibCh, ref q3CalibCh); } public void GetQ3Calibration(double refVolume, double refTime, double[] initCalibFactor, ref bool[] isChQ3CalibValid, ref double[] q3CalibCh) + { + var differences = new double[3]; + GetQ3Calibration(refVolume, refTime, initCalibFactor, ref isChQ3CalibValid, ref differences, ref q3CalibCh); + } + + public void GetQ3Calibration(double refVolume, double refTime, double[] initCalibFactor, ref bool[] isChQ3CalibValid, ref double[] calibDiffPercent, ref double[] q3CalibCh) { log.Debug("=== Q3 CALIBRATION START ==="); @@ -3991,7 +4021,7 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations } } - log.Debug($"Inputs: refVolume={refVolume}, refTime={refTime}, initCalibFactor={initCalibFactor}"); + log.Debug($"Inputs: refVolume={refVolume}, refTime={refTime}, initCalibFactors={string.Join(",", initCalibFactor)}"); if (_rawStartEndByChannel == null) { @@ -4081,25 +4111,13 @@ namespace TBF.Rig.RegisterReaders.GenesisRegReader.implementations q3CalibCh[iChannel] = (refVolume / recalculatedDeltaVolume) * initCalibFactor[iChannel]; double diffPercent = Math.Abs((initCalibFactor[iChannel] - q3CalibCh[iChannel] ) / initCalibFactor[iChannel]) * 100.0; - isChQ3CalibValid[iChannel] = diffPercent <= 5.0; + isChQ3CalibValid[iChannel] = diffPercent <= 5.0 && !double.IsNaN(q3CalibCh[iChannel]) && !double.IsInfinity(q3CalibCh[iChannel]) && q3CalibCh[iChannel] >= 1 && q3CalibCh[iChannel] <= ushort.MaxValue; + calibDiffPercent[iChannel] = diffPercent; log.Debug($"Calculated Q3Calib Ch[{iChannel}] ={q3CalibCh[iChannel]} DiffPercent={diffPercent}% isValid[{isChQ3CalibValid[iChannel]}] IninitCalibFactor={initCalibFactor}"); - } log.Debug("=== Q3 CALIBRATION END ==="); } - - void newPokus() - { - //TODO BUMI implement genesis communication - //volat z GCI Bridge - - //vybere sa component - GCI bridge - // - rozhranie - // - database - - } - } -} \ No newline at end of file +} diff --git a/TBF/Rig/Sequences/MainSeq.cs b/TBF/Rig/Sequences/MainSeq.cs index 005170479..1754a419b 100644 --- a/TBF/Rig/Sequences/MainSeq.cs +++ b/TBF/Rig/Sequences/MainSeq.cs @@ -67,7 +67,7 @@ namespace TBF.Rig.Sequences // // /// 3th argument // IList iPerlCommParams = new List(); - // foreach (var tp in multiTestParams) iPerlCommParams.Add(tp as iPerlCommunicationParams); + // foreach (var tp in multiTestParams) iPerlCommParams.Add(tp as TestMethods.iPerlCommunication.iPerlCommunicationParams); // // /*myRef.modelessDlg = new TestMethods.iPerlCommunication.iPerlCommunicationForm(iPerlCfg, tests, iPerlCommParams); // myRef.modelessDlg.Show();*/ @@ -75,6 +75,14 @@ namespace TBF.Rig.Sequences // myRef.modelessDlg = new SmartCommunicationForm( testMethod , tests, iPerlCommParams); // myRef.modelessDlg.Show(); + if (testMethod is TestMethods.GenesisCommunication.TestMethod genesisMethod) + { + var parameters = multiTestParams.Cast().ToList(); + myRef.modelessDlg = new TestMethods.GenesisCommunication.GenesisCommunicationForm(genesisMethod, tests, parameters); + myRef.modelessDlg.Show(); + return; + } + /// 1nd argument TestMethods.iPerlCommunication.TestMethodCfg iPerlCfg = cfg as TestMethods.iPerlCommunication.TestMethodCfg; @@ -88,7 +96,7 @@ namespace TBF.Rig.Sequences myRef.modelessDlg.Show();*/ myRef.modelessDlg = new TestMethods.iPerlCommunication.iPerlCommunicationForm( - testMethod as TBF.Rig.TestMethods.iPerlCommunication.TestMethod, tests, iPerlCommParams); + testMethod as TestMethods.iPerlCommunication.TestMethod, tests, iPerlCommParams); myRef.modelessDlg.Show(); } catch (Exception e) @@ -1477,15 +1485,24 @@ namespace TBF.Rig.Sequences for (int wmNr0 = BatchRslts.Batch.WaterMeters.Count - 1; wmNr0 >= 0; wmNr0--) { var wm = BatchRslts.Batch.WaterMeters[wmNr0]; - if (wm.Disabled) - { - /// Do not save disabled watermeters to DB, remove them from the list - BatchRslts.Batch.WaterMeters.RemoveAt(wmNr0); + if (wm.Q3Channel == 0){ + if (wm.Disabled) + { + /// Do not save disabled watermeters to DB, remove them from the list + BatchRslts.Batch.WaterMeters.RemoveAt(wmNr0); + } + else + { + /// Determine whether the watermeter passed all required tests + wm.Passed = wm.PassedFromTests(); + } } else { - /// Determine whether the watermeter passed all required tests - wm.Passed = wm.PassedFromTests(); + if (!wm.Disabled) + { + wm.Passed = wm.PassedFromTests(); + } } } diff --git a/TBF/Rig/Sequences/SequenceBase.cs b/TBF/Rig/Sequences/SequenceBase.cs index d3010bb8c..22fd7560e 100644 --- a/TBF/Rig/Sequences/SequenceBase.cs +++ b/TBF/Rig/Sequences/SequenceBase.cs @@ -1305,7 +1305,10 @@ namespace TBF.Rig.Sequences var smryItems = DEItem.GetSummaryColumns(); - for (int i = 0; i < BatchRslts.Batch.WaterMeters.Count; i++) + //TODO BUMI check this part + //Make channels showing the data + int iWMCount = false ? BatchRslts.WMPositionsCount : BatchRslts.Batch.WaterMeters.Count; + for (int i = 0; i < iWMCount; i++) { if (BatchRslts.Batch.WaterMeters != null && BatchRslts.Batch.WaterMeters.Count > i && diff --git a/TBF/Rig/TbfComponents.cs b/TBF/Rig/TbfComponents.cs index c8993abaa..32be3b7fb 100644 --- a/TBF/Rig/TbfComponents.cs +++ b/TBF/Rig/TbfComponents.cs @@ -198,7 +198,7 @@ namespace TBF.Rig new TestMethods.FlyingStartFirstRepetWithMassColl.HeatMeters.Factory(), new TestMethods.FlyingStartTankCollection.Single.Factory(), new TestMethods.FlyingStartTankCollection.Compound.Factory(), - //new TestMethods.GenesisCommunication.GenesisHead.Factory(), + new TestMethods.GenesisCommunication.Factory(), new TestMethods.GrabImage.Factory(), new TestMethods.iPerlCommunication.TestMethodFactory(), /// iPerlCommunication new TestMethods.LeakTest.Factory(), diff --git a/TBF/Rig/TestMethods/FlyingStart/FlyingStartSeq.cs b/TBF/Rig/TestMethods/FlyingStart/FlyingStartSeq.cs index b4e75deb3..59d2f4fd4 100644 --- a/TBF/Rig/TestMethods/FlyingStart/FlyingStartSeq.cs +++ b/TBF/Rig/TestMethods/FlyingStart/FlyingStartSeq.cs @@ -12,6 +12,8 @@ using TBF.Rig; using TBF.Rig.GenericDevices; using TBF.Boxes; using TBF.Resources; +using TBF.Rig.RegisterReaders.GenesisRegReader.implementations; +using TBF.Rig.Sequences; using TBF.Rig.Uni.SharedDialogs.SmartMetersCommunication.common; using TBF.UiBridge; @@ -464,6 +466,11 @@ namespace TBF.Rig.TestMethods.FlyingStart } while (!e.Contains(Event.TestCompleted) && !e.Contains(Event.Next)); /// 'Next' button is enabled in Debug version only + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Test_in_calculation); + //------------------------------------------------ + /// Measurement loop end StopRecordingStatistics(); @@ -532,7 +539,7 @@ namespace TBF.Rig.TestMethods.FlyingStart tstRslt.TimeBtwnMassMsrmnts = 0; tstRslt.ConstMasterRaw = outPath.FlowMeter.LtrPerPulse; /// Uncorrected master flowmeter coefficient tstRslt.VolumeMaster = tstRslt.ConstMasterRaw * tstRslt.PulsesMaster; /// [l] volume from the master flow meter - double flowMID = 3.6 * tstRslt.VolumeMaster / tstRslt.TestTime; /// [m3/h] + double flowMID = tstRslt.TestTime == 0 ? 0 : 3.6 * tstRslt.VolumeMaster / tstRslt.TestTime; /// [m3/h] /// Corrected data tstRslt.MassStart = 0; @@ -542,7 +549,7 @@ namespace TBF.Rig.TestMethods.FlyingStart /// Main result calculation tstRslt.VolumeCTV = tstRslt.ConstMasterCorr * tstRslt.PulsesMaster; /// [l] 1000.0f is because density is in [kg/m3] - tstRslt.Flow = 3.6 * tstRslt.VolumeCTV / tstRslt.TestTime; + tstRslt.Flow = tstRslt.TestTime==0 ? 0 : 3.6 * tstRslt.VolumeCTV / tstRslt.TestTime; tstRslt.ErrorMaster = 0.0; /// Not available without a mass measurement tstRslt.ConstMaster = tstRslt.ConstMasterCorr; @@ -660,6 +667,7 @@ namespace TBF.Rig.TestMethods.FlyingStart TestMethods.iPerlCommunication.iPerlHead.IperlHead iPerl = regReader as TestMethods.iPerlCommunication.iPerlHead.IperlHead; GenericDevices.IRegReaderLiveCamera cameraRoi = regReader as GenericDevices.IRegReaderLiveCamera; //GenesisHead Genesis = regReader as GenesisHead; + TBF.Rig.RegisterReaders.GenesisRegReader.implementations.GenesisSmartReader GenesisSmart = regReader as TBF.Rig.RegisterReaders.GenesisRegReader.implementations.GenesisSmartReader; if (meterRslt != null && regReader != null) { @@ -711,6 +719,24 @@ namespace TBF.Rig.TestMethods.FlyingStart Genesis.Log(" MeterError = " + calError.ToString() + " %"); } else*/ + if (GenesisSmart != null) + { + log.Debug("GenesisSmart - store data on end!"); + int CH1=0, CH2=1, CH3=2; + + CalculateMeterResults(meterRslt, GenesisSmart, tstRslt,GenesisSmart.TimestampSecStart, GenesisSmart.TimestampSecEnd, GenesisSmart.VolumeLtrStart, GenesisSmart.VolumeLtrEnd); + + //Init Calculate Calibration + GenesisSmart.RefVolume = meterRslt.VolumeRef; + GenesisSmart.RefTime = meterRslt.TestTime; + + //Store Raw Calibration Data to database + WaterMeterParentCopy(i, CH1,testName,meterRslt,GenesisSmart,tstRslt); + WaterMeterParentCopy(i, CH2,testName,meterRslt,GenesisSmart,tstRslt); + WaterMeterParentCopy(i, CH3,testName,meterRslt,GenesisSmart,tstRslt); + + } + else { if (dstrReader != null) { @@ -918,6 +944,217 @@ namespace TBF.Rig.TestMethods.FlyingStart // } // } + private const int CountCh = 3; + private static void WaterMeterParentCopy(int i, int iCH, string testName, MeterTestRslt meterRslt, + GenesisSmartReader genesisSmart, + TestRslt tstRslt) + { + try + { + WaterMeter waterMeterParent = BatchRslts.Batch.WaterMeters[i]; + int wmNrChX = (i * CountCh) + BatchRslts.WMPositionsCount + iCH + 1; + String sSerialNr = + (string.IsNullOrEmpty(waterMeterParent.SerialNr) ? (i + 1).ToString() : waterMeterParent.SerialNr) + + "_CH" + (iCH + 1); + WaterMeter chXWaterMeter = null; + //------ add new water meter to batch ------ + if (BatchRslts.Batch.WaterMeters.Count < wmNrChX || BatchRslts.Batch.WaterMeters[wmNrChX - 1] == null) + { + log.Debug("add new water meter to batch, CH = " + (iCH + 1) + " CH = " + wmNrChX); + chXWaterMeter = new WaterMeter() + { + MeterTestRslts = new List(), + }; + //This will delete each setting before + chXWaterMeter.CopyContentFrom(waterMeterParent); + + chXWaterMeter.Batch = BatchRslts.Batch; + chXWaterMeter.WaterMeterData = waterMeterParent.WaterMeterData; + + chXWaterMeter.SerialNr = sSerialNr; + chXWaterMeter.WMPosition = wmNrChX; + chXWaterMeter.Q3Channel = iCH + 1; + chXWaterMeter.YearOfProduction = waterMeterParent.YearOfProduction; + chXWaterMeter.Disabled = false; + + BatchRslts.Batch.WaterMeters.Add(chXWaterMeter); + } + else + { + chXWaterMeter = BatchRslts.Batch.WaterMeters[wmNrChX - 1]; + + chXWaterMeter.Batch = BatchRslts.Batch; + chXWaterMeter.WaterMeterData = waterMeterParent.WaterMeterData; + chXWaterMeter.SerialNr = sSerialNr; + chXWaterMeter.WMPosition = wmNrChX; + chXWaterMeter.Q3Channel = iCH + 1; + chXWaterMeter.YearOfProduction = waterMeterParent.YearOfProduction; + chXWaterMeter.Disabled = false; + } + //~------ add new water meter to batch ------~ + + //create copy of meterRslt and add to additionalResultsByChannel + MeterTestRslt meterTestRsltChX = new MeterTestRslt(chXWaterMeter, meterRslt.TestRslt, + (CompoundMeterId)meterRslt.CompoundMeterId); + meterTestRsltChX.Q3Channel = iCH + 1; + chXWaterMeter.MeterTestRslts.Add(meterTestRsltChX); + MeterTestRslt chanelXMeterRslt = + BatchRslts.GetMeterTestRslt(testName, wmNrChX - 1, Common.CompoundMeterId.Single); + + if (chanelXMeterRslt != null) + { + chanelXMeterRslt?.CopyContentFrom(meterRslt); + if (iCH == 0) + { + chanelXMeterRslt.Q3Channel = 1; + CalculateMeterResults(chanelXMeterRslt, genesisSmart, tstRslt, + genesisSmart.TimestampSecStartRawCh1, + genesisSmart.TimestampSecEndRawCh1, genesisSmart.VolumeLtrStartRawCh1, + genesisSmart.VolumeLtrEndRawCh1); + + try + { + TestRsltCalibFactor testRsltCalibFactor = null; + if (tstRslt.GetCalibrationFactors(waterMeterParent).Count > 0) + { + testRsltCalibFactor = tstRslt.GetCalibrationFactors(waterMeterParent)[0]; + } + else + { + //store in table + testRsltCalibFactor = new TestRsltCalibFactor(); + tstRslt.GetCalibrationFactors(waterMeterParent).Add(testRsltCalibFactor); + testRsltCalibFactor.CalibFactorIndex = 1; + } + + testRsltCalibFactor.TestRslt = chanelXMeterRslt.TestRslt; + testRsltCalibFactor.TimeStart = genesisSmart.TimestampSecStartRawCh1; + testRsltCalibFactor.TimeEnd = genesisSmart.TimestampSecEndRawCh1; + testRsltCalibFactor.VolumeStart = genesisSmart.VolumeLtrStartRawCh1; + testRsltCalibFactor.VolumeEnd = genesisSmart.VolumeLtrEndRawCh1; + testRsltCalibFactor.Error = chanelXMeterRslt.Error; + } + catch (Exception ex) + { + log.Error("Error in store to DB result set CH1", ex); + } + } + else if (iCH == 1) + { + chanelXMeterRslt.Q3Channel = 2; + CalculateMeterResults(chanelXMeterRslt, genesisSmart, tstRslt, + genesisSmart.TimestampSecStartRawCh2, + genesisSmart.TimestampSecEndRawCh2, genesisSmart.VolumeLtrStartRawCh2, + genesisSmart.VolumeLtrEndRawCh2); + + try + { + TestRsltCalibFactor testRsltCalibFactor = null; + if (tstRslt.GetCalibrationFactors(waterMeterParent).Count > 1) + { + testRsltCalibFactor = tstRslt.GetCalibrationFactors(waterMeterParent)[1]; + } + else + { + //store in table + testRsltCalibFactor = new TestRsltCalibFactor(); + tstRslt.GetCalibrationFactors(waterMeterParent).Add(testRsltCalibFactor); + testRsltCalibFactor.CalibFactorIndex = 2; + } + + testRsltCalibFactor.TestRslt = chanelXMeterRslt.TestRslt; + testRsltCalibFactor.TimeStart = genesisSmart.TimestampSecStartRawCh2; + testRsltCalibFactor.TimeEnd = genesisSmart.TimestampSecEndRawCh2; + testRsltCalibFactor.VolumeStart = genesisSmart.VolumeLtrStartRawCh2; + testRsltCalibFactor.VolumeEnd = genesisSmart.VolumeLtrEndRawCh2; + testRsltCalibFactor.Error = chanelXMeterRslt.Error; + } + catch (Exception ex) + { + log.Error("Error in store to DB result set CH2", ex); + } + } + else if (iCH == 2) + { + chanelXMeterRslt.Q3Channel = 3; + CalculateMeterResults(chanelXMeterRslt, genesisSmart, tstRslt, + genesisSmart.TimestampSecStartRawCh3, + genesisSmart.TimestampSecEndRawCh3, genesisSmart.VolumeLtrStartRawCh3, + genesisSmart.VolumeLtrEndRawCh3); + try + { + TestRsltCalibFactor testRsltCalibFactor = null; + if (tstRslt.GetCalibrationFactors(waterMeterParent).Count > 2) + { + testRsltCalibFactor = tstRslt.GetCalibrationFactors(waterMeterParent)[2]; + } + else + { + //store in table + testRsltCalibFactor = new TestRsltCalibFactor(); + tstRslt.GetCalibrationFactors(waterMeterParent).Add(testRsltCalibFactor); + testRsltCalibFactor.CalibFactorIndex = 3; + } + + testRsltCalibFactor.TestRslt = chanelXMeterRslt.TestRslt; + testRsltCalibFactor.TimeStart = genesisSmart.TimestampSecStartRawCh3; + testRsltCalibFactor.TimeEnd = genesisSmart.TimestampSecEndRawCh3; + testRsltCalibFactor.VolumeStart = genesisSmart.VolumeLtrStartRawCh3; + testRsltCalibFactor.VolumeEnd = genesisSmart.VolumeLtrEndRawCh3; + testRsltCalibFactor.Error = chanelXMeterRslt.Error; + } + catch (Exception ex) + { + log.Error("Error in store to DB result set CH3", ex); + } + } + + if (!genesisSmart.EnableShowChanels) + { + chXWaterMeter.Disabled = !genesisSmart.EnableShowChanels; + //meterTestRsltChX.TestDone = false; + } + else + { + chXWaterMeter.Disabled = false; + meterTestRsltChX.TestDone = true; + } + + meterTestRsltChX.Passed = meterRslt.Passed; + } + } + catch (Exception ex) + { + log.Error("Error in WaterMeterParentCopy", ex); + } + } + + private static void CalculateMeterResults(MeterTestRslt meterRslt, IRegReaderDatastream dstrReader, TestRslt tstRslt, double dstrReaderTimestampSecStart, double dstrReaderTimestampSecEnd, double dstrReaderVolumeLtrStart, double dstrReaderVolumeLtrEnd) + { + try + { + meterRslt.TimestampStart = dstrReaderTimestampSecStart; + meterRslt.TimestampEnd = !dstrReader.NoSamples + ? dstrReaderTimestampSecEnd + : (dstrReaderTimestampSecStart + tstRslt.TestTime); + meterRslt.TestTime = meterRslt.TimestampEnd - meterRslt.TimestampStart; + meterRslt.VolumeStart = dstrReaderVolumeLtrStart; /// liter + meterRslt.VolumeEnd = dstrReaderVolumeLtrEnd; /// liter + meterRslt.VolumeMeter = + Math.Abs(dstrReaderVolumeLtrEnd - dstrReaderVolumeLtrStart); + meterRslt.VolumeRef = tstRslt.TestTime == 0 + ? tstRslt.VolumeCTV + : tstRslt.VolumeCTV * meterRslt.TestTime / tstRslt.TestTime; + meterRslt.PulsesMaster = tstRslt.TestTime == 0 + ? tstRslt.PulsesMaster + : tstRslt.PulsesMaster * meterRslt.TestTime / tstRslt.TestTime; + meterRslt.Error = Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, + meterRslt.VolumeRef); // Error based on volume difference + }catch(Exception ex) + { + log.Error($"Error in calculate meter results, meterRslt.Name:{meterRslt.Name()} Calculation Bug Detail:", ex); + } + } IList Simulate(Config.Entities.Test test, int repetitionNr, bool isLastRepetition, Compound.TestParams compoundTestParams, @@ -943,6 +1180,14 @@ namespace TBF.Rig.TestMethods.FlyingStart else if (test.Name.ToLower().Contains("q1")) MakeSimulated(test, 1, 0, -5.1f); else MakeSimulated(test, 1, 0, 0.9f); + //TODO bumi do simulate foe Q3 Calibration + /// + /// Single meters + /// + SimulateQ3CalibrationData(test,1, 0, -5.1f); + + + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.Completed)); Bridge.OnTestCompleted(this, new TestCompletedEventArgs(test.Name, BatchRslts.GetTestRslt(Results.Utils.GetTestName(test.Name, 1, 1), 0))); allResults.Info(TestResult2CsvLine(test.Name, 0)); /// Append the results to the CSV-file @@ -958,5 +1203,46 @@ namespace TBF.Rig.TestMethods.FlyingStart return new List { TestAndLogUiCmdStop(test, e) ? Event.UiCmdStop : Event.Done }; } + + private void SimulateQ3CalibrationData(Test test,int repetitionNr, int part, float errorPctBase) + { + string testName = test.Name; + string fullTestName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr); + + Results.Entities.TestRslt tstRslt = ProcessData.BatchRslts.GetTestRslt(fullTestName, part); + Results.Utils.GetCounterStates(tstRslt, Program.LocalSettings.Counters); + + + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (!test.IsPartCompatible(Utils.PartNr(i + 1, BatchRslts.Batch.Compound))) continue; + + Results.Entities.MeterTestRslt meterRslt = + BatchRslts.GetMeterTestRslt(testName, i, Common.CompoundMeterId.Single); + GenericDevices.IRegReader regReader = sensPath.RegisterReaders[i]; + TBF.Rig.RegisterReaders.GenesisRegReader.implementations.GenesisSmartReader GenesisSmart = + regReader as TBF.Rig.RegisterReaders.GenesisRegReader.implementations.GenesisSmartReader; + + + if (GenesisSmart != null) + { + log.Debug("GenesisSmart - store data on end!"); + int CH1 = 0, CH2 = 1, CH3 = 2; + + CalculateMeterResults(meterRslt, GenesisSmart, tstRslt, GenesisSmart.TimestampSecStart, + GenesisSmart.TimestampSecEnd, GenesisSmart.VolumeLtrStart, GenesisSmart.VolumeLtrEnd); + + //Init Calculate Calibration + GenesisSmart.RefVolume = meterRslt.VolumeRef; + GenesisSmart.RefTime = meterRslt.TestTime; + + //Store Raw Calibration Data to database + WaterMeterParentCopy(i, CH1, testName, meterRslt, GenesisSmart, tstRslt); + WaterMeterParentCopy(i, CH2, testName, meterRslt, GenesisSmart, tstRslt); + WaterMeterParentCopy(i, CH3, testName, meterRslt, GenesisSmart, tstRslt); + + } + } + } } } diff --git a/TBF/Rig/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs b/TBF/Rig/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs index 91ff5bfbc..57d6853b2 100644 --- a/TBF/Rig/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs +++ b/TBF/Rig/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs @@ -18,6 +18,7 @@ using TBF.Rig.GenericDevices; using TBF.Rig.RegisterReaders.GenesisRegReader.implementations; using TBF.Rig.RegisterReaders.PoseidonReader; using TBF.Rig.RegisterReaders.PoseidonReader.implementations; +using TBF.Rig.Sequences; using TBF.Rig.Uni.SharedDialogs.SmartMetersCommunication.common; using TBF.UiBridge; @@ -1106,12 +1107,13 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection bUpgradeCountOfMeters = true; int CH1=0, CH2=1, CH3=2; - //BatchRslts.Batch.WaterMeters.Add(ch1WaterMeter); //[i + BatchRslts.WMPositionsCount + CH1 + 1] - //BatchRslts.Batch.WaterMeters.Add(ch1WaterMeter); //[i + BatchRslts.WMPositionsCount + CH2 + 1] - //BatchRslts.Batch.WaterMeters.Add(ch1WaterMeter); //[i + BatchRslts.WMPositionsCount + CH3 + 1] - CalculateMeterResults(meterRslt, GenesisSmart, tstRslt,GenesisSmart.TimestampSecStart, GenesisSmart.TimestampSecEnd, GenesisSmart.VolumeLtrStart, GenesisSmart.VolumeLtrEnd); + //Init Calculate Calibration + GenesisSmart.RefVolume = meterRslt.VolumeRef; + GenesisSmart.RefTime = meterRslt.TestTime; + + //Store Raw Calibration Data to database WaterMeterParentCopy(i, CH1,testName,meterRslt,GenesisSmart,tstRslt); WaterMeterParentCopy(i, CH2,testName,meterRslt,GenesisSmart,tstRslt); WaterMeterParentCopy(i, CH3,testName,meterRslt,GenesisSmart,tstRslt); @@ -1376,91 +1378,212 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection GenesisSmartReader genesisSmart, TestRslt tstRslt) { - WaterMeter waterMeterParent = BatchRslts.Batch.WaterMeters[i]; - int wmNrChX = (i*CountCh) + BatchRslts.WMPositionsCount + iCH + 1; - String sSerialNr = waterMeterParent.SerialNr + "_CH" + (iCH + 1); - WaterMeter chXWaterMeter = null; - //------ add new water meter to batch ------ - if (BatchRslts.Batch.WaterMeters.Count < wmNrChX || BatchRslts.Batch.WaterMeters[wmNrChX-1] == null) + try { - log.Debug("add new water meter to batch, CH = " + (iCH + 1) + " CH = " + wmNrChX); - chXWaterMeter = new WaterMeter() + WaterMeter waterMeterParent = BatchRslts.Batch.WaterMeters[i]; + int wmNrChX = (i * CountCh) + BatchRslts.WMPositionsCount + iCH + 1; + String sSerialNr = + (string.IsNullOrEmpty(waterMeterParent.SerialNr) ? (i+1).ToString() : waterMeterParent.SerialNr) + + "_CH" + (iCH + 1); + WaterMeter chXWaterMeter = null; + //------ add new water meter to batch ------ + if (BatchRslts.Batch.WaterMeters.Count < wmNrChX || BatchRslts.Batch.WaterMeters[wmNrChX - 1] == null) { - Batch = BatchRslts.Batch, - WaterMeterData = waterMeterParent.WaterMeterData, - MeterTestRslts = new List(), - SerialNr = sSerialNr, - WMPosition = wmNrChX, - YearOfProduction = 0, - Disabled = false, - }; - chXWaterMeter.CopyContentFrom(waterMeterParent); + log.Debug("add new water meter to batch, CH = " + (iCH + 1) + " CH = " + wmNrChX); + chXWaterMeter = new WaterMeter() + { + MeterTestRslts = new List(), + }; + //This will delete each setting before + chXWaterMeter.CopyContentFrom(waterMeterParent); - chXWaterMeter.SerialNr = sSerialNr; - chXWaterMeter.WMPosition = wmNrChX; - chXWaterMeter.YearOfProduction = waterMeterParent.YearOfProduction; - chXWaterMeter.Disabled = false; + chXWaterMeter.Batch = BatchRslts.Batch; + chXWaterMeter.WaterMeterData = waterMeterParent.WaterMeterData; - BatchRslts.Batch.WaterMeters.Add(chXWaterMeter); - } - else - { - chXWaterMeter = BatchRslts.Batch.WaterMeters[wmNrChX-1]; - } - //~------ add new water meter to batch ------~ - - //create copy of meterRslt and add to additionalResultsByChannel - MeterTestRslt meterTestRsltChX = new MeterTestRslt(chXWaterMeter, meterRslt.TestRslt, (CompoundMeterId)meterRslt.CompoundMeterId); - chXWaterMeter.MeterTestRslts.Add(meterTestRsltChX); - MeterTestRslt chanelXMeterRslt = BatchRslts.GetMeterTestRslt(testName, wmNrChX-1, Common.CompoundMeterId.Single); - - if (chanelXMeterRslt != null) - { - chanelXMeterRslt?.CopyContentFrom(meterRslt); - if (iCH == 0) - { - CalculateMeterResults(chanelXMeterRslt, genesisSmart, tstRslt, genesisSmart.TimestampSecStartRawCh1, - genesisSmart.TimestampSecEndRawCh1, genesisSmart.VolumeLtrStartRawCh1, genesisSmart.VolumeLtrEndRawCh1); - } - else if (iCH == 1) - { - CalculateMeterResults(chanelXMeterRslt, genesisSmart, tstRslt, genesisSmart.TimestampSecStartRawCh2, - genesisSmart.TimestampSecEndRawCh2, genesisSmart.VolumeLtrStartRawCh2, genesisSmart.VolumeLtrEndRawCh2); - } - else if (iCH == 2) - { - CalculateMeterResults(chanelXMeterRslt, genesisSmart, tstRslt, genesisSmart.TimestampSecStartRawCh3, - genesisSmart.TimestampSecEndRawCh3, genesisSmart.VolumeLtrStartRawCh3, genesisSmart.VolumeLtrEndRawCh3); - } + chXWaterMeter.SerialNr = sSerialNr; + chXWaterMeter.WMPosition = wmNrChX; + chXWaterMeter.Q3Channel = iCH+1; + chXWaterMeter.YearOfProduction = waterMeterParent.YearOfProduction; + chXWaterMeter.Disabled = false; - if (!genesisSmart.EnableShowChanels) - { - chXWaterMeter.Disabled = !genesisSmart.EnableShowChanels; - meterTestRsltChX.TestDone = false; + + BatchRslts.Batch.WaterMeters.Add(chXWaterMeter); } else { - meterTestRsltChX.TestDone = true; - } + chXWaterMeter = BatchRslts.Batch.WaterMeters[wmNrChX - 1]; - meterTestRsltChX.Passed = meterRslt.Passed; + + chXWaterMeter.Batch = BatchRslts.Batch; + chXWaterMeter.WaterMeterData = waterMeterParent.WaterMeterData; + chXWaterMeter.SerialNr = sSerialNr; + chXWaterMeter.WMPosition = wmNrChX; + chXWaterMeter.Q3Channel = iCH+1; + chXWaterMeter.YearOfProduction = waterMeterParent.YearOfProduction; + chXWaterMeter.Disabled = false; + } + //~------ add new water meter to batch ------~ + + //create copy of meterRslt and add to additionalResultsByChannel + MeterTestRslt meterTestRsltChX = new MeterTestRslt(chXWaterMeter, meterRslt.TestRslt, + (CompoundMeterId)meterRslt.CompoundMeterId); + meterTestRsltChX.Q3Channel = iCH + 1; + chXWaterMeter.MeterTestRslts.Add(meterTestRsltChX); + MeterTestRslt chanelXMeterRslt = + BatchRslts.GetMeterTestRslt(testName, wmNrChX - 1, Common.CompoundMeterId.Single); + + if (chanelXMeterRslt != null) + { + chanelXMeterRslt?.CopyContentFrom(meterRslt); + if (iCH == 0) + { + chanelXMeterRslt.Q3Channel = 1; + CalculateMeterResults(chanelXMeterRslt, genesisSmart, tstRslt, + genesisSmart.TimestampSecStartRawCh1, + genesisSmart.TimestampSecEndRawCh1, genesisSmart.VolumeLtrStartRawCh1, + genesisSmart.VolumeLtrEndRawCh1); + + try + { + TestRsltCalibFactor testRsltCalibFactor = null; + if (tstRslt.GetCalibrationFactors(waterMeterParent).Count > 0) + { + testRsltCalibFactor = tstRslt.GetCalibrationFactors(waterMeterParent)[0]; + } + else + { + //store in table + testRsltCalibFactor = new TestRsltCalibFactor(); + tstRslt.GetCalibrationFactors(waterMeterParent).Add(testRsltCalibFactor); + testRsltCalibFactor.CalibFactorIndex = 1; + } + + testRsltCalibFactor.TestRslt = chanelXMeterRslt.TestRslt; + testRsltCalibFactor.TimeStart = genesisSmart.TimestampSecStartRawCh1; + testRsltCalibFactor.TimeEnd = genesisSmart.TimestampSecEndRawCh1; + testRsltCalibFactor.VolumeStart = genesisSmart.VolumeLtrStartRawCh1; + testRsltCalibFactor.VolumeEnd = genesisSmart.VolumeLtrEndRawCh1; + testRsltCalibFactor.Error = chanelXMeterRslt.Error; + } + catch (Exception ex) + { + log.Error("Error in store to DB result set CH1", ex); + } + } + else if (iCH == 1) + { + chanelXMeterRslt.Q3Channel = 2; + CalculateMeterResults(chanelXMeterRslt, genesisSmart, tstRslt, + genesisSmart.TimestampSecStartRawCh2, + genesisSmart.TimestampSecEndRawCh2, genesisSmart.VolumeLtrStartRawCh2, + genesisSmart.VolumeLtrEndRawCh2); + try + { + + TestRsltCalibFactor testRsltCalibFactor = null; + if (tstRslt.GetCalibrationFactors(waterMeterParent).Count > 1) + { + testRsltCalibFactor = tstRslt.GetCalibrationFactors(waterMeterParent)[1]; + } + else + { + //store in table + testRsltCalibFactor = new TestRsltCalibFactor(); + tstRslt.GetCalibrationFactors(waterMeterParent).Add(testRsltCalibFactor); + testRsltCalibFactor.CalibFactorIndex = 2; + } + + testRsltCalibFactor.TestRslt = chanelXMeterRslt.TestRslt; + testRsltCalibFactor.TimeStart = genesisSmart.TimestampSecStartRawCh2; + testRsltCalibFactor.TimeEnd = genesisSmart.TimestampSecEndRawCh2; + testRsltCalibFactor.VolumeStart = genesisSmart.VolumeLtrStartRawCh2; + testRsltCalibFactor.VolumeEnd = genesisSmart.VolumeLtrEndRawCh2; + testRsltCalibFactor.Error = chanelXMeterRslt.Error; + } + catch (Exception ex) + { + log.Error("Error in store to DB result set CH2", ex); + } + } + else if (iCH == 2) + { + chanelXMeterRslt.Q3Channel = 3; + CalculateMeterResults(chanelXMeterRslt, genesisSmart, tstRslt, + genesisSmart.TimestampSecStartRawCh3, + genesisSmart.TimestampSecEndRawCh3, genesisSmart.VolumeLtrStartRawCh3, + genesisSmart.VolumeLtrEndRawCh3); + + try + { + TestRsltCalibFactor testRsltCalibFactor = null; + if (tstRslt.GetCalibrationFactors(waterMeterParent).Count > 2) + { + testRsltCalibFactor = tstRslt.GetCalibrationFactors(waterMeterParent)[2]; + } + else + { + //store in table + testRsltCalibFactor = new TestRsltCalibFactor(); + tstRslt.GetCalibrationFactors(waterMeterParent).Add(testRsltCalibFactor); + testRsltCalibFactor.CalibFactorIndex = 3; + } + + testRsltCalibFactor.TestRslt = chanelXMeterRslt.TestRslt; + testRsltCalibFactor.TimeStart = genesisSmart.TimestampSecStartRawCh3; + testRsltCalibFactor.TimeEnd = genesisSmart.TimestampSecEndRawCh3; + testRsltCalibFactor.VolumeStart = genesisSmart.VolumeLtrStartRawCh3; + testRsltCalibFactor.VolumeEnd = genesisSmart.VolumeLtrEndRawCh3; + testRsltCalibFactor.Error = chanelXMeterRslt.Error; + } + catch (Exception ex) + { + log.Error("Error in store to DB result set CH3", ex); + } + } + + if (!genesisSmart.EnableShowChanels) + { + chXWaterMeter.Disabled = !genesisSmart.EnableShowChanels; + //meterTestRsltChX.TestDone = false; + } + else + { + chXWaterMeter.Disabled = false; + meterTestRsltChX.TestDone = true; + } + + meterTestRsltChX.Passed = meterRslt.Passed; + } + }catch(Exception ex) + { + log.Error("Error in WaterMeterParentCopy", ex); } } private static void CalculateMeterResults(MeterTestRslt meterRslt, IRegReaderDatastream dstrReader, TestRslt tstRslt, double dstrReaderTimestampSecStart, double dstrReaderTimestampSecEnd, double dstrReaderVolumeLtrStart, double dstrReaderVolumeLtrEnd) { - meterRslt.TimestampStart = dstrReaderTimestampSecStart; - meterRslt.TimestampEnd = !dstrReader.NoSamples - ? dstrReaderTimestampSecEnd - : (dstrReaderTimestampSecStart + tstRslt.TestTime); - meterRslt.TestTime = meterRslt.TimestampEnd - meterRslt.TimestampStart; - meterRslt.VolumeStart = dstrReaderVolumeLtrStart; /// liter - meterRslt.VolumeEnd = dstrReaderVolumeLtrEnd; /// liter - meterRslt.VolumeMeter = - Math.Abs(dstrReaderVolumeLtrEnd - dstrReaderVolumeLtrStart); - meterRslt.VolumeRef = tstRslt.TestTime==0? tstRslt.VolumeCTV : tstRslt.VolumeCTV * meterRslt.TestTime / tstRslt.TestTime; - meterRslt.PulsesMaster = tstRslt.TestTime == 0? tstRslt.PulsesMaster : - tstRslt.PulsesMaster * meterRslt.TestTime / tstRslt.TestTime; + try + { + meterRslt.TimestampStart = dstrReaderTimestampSecStart; + meterRslt.TimestampEnd = !dstrReader.NoSamples + ? dstrReaderTimestampSecEnd + : (dstrReaderTimestampSecStart + tstRslt.TestTime); + meterRslt.TestTime = meterRslt.TimestampEnd - meterRslt.TimestampStart; + meterRslt.VolumeStart = dstrReaderVolumeLtrStart; /// liter + meterRslt.VolumeEnd = dstrReaderVolumeLtrEnd; /// liter + meterRslt.VolumeMeter = Math.Abs(dstrReaderVolumeLtrEnd - dstrReaderVolumeLtrStart); + meterRslt.VolumeRef = tstRslt.TestTime == 0 + ? tstRslt.VolumeCTV + : tstRslt.VolumeCTV * meterRslt.TestTime / tstRslt.TestTime; + meterRslt.PulsesMaster = tstRslt.TestTime == 0 + ? tstRslt.PulsesMaster + : tstRslt.PulsesMaster * meterRslt.TestTime / tstRslt.TestTime; + meterRslt.Error = Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, + meterRslt.VolumeRef); // Error based on volume difference + }catch(Exception ex) + { + log.Error($"Error in calculate meter results, meterRslt.Name:{meterRslt.Name()} Calculation Bug Detail:", ex); + } } @@ -1504,6 +1627,12 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection MakeSimulated(test, repetitionNr, test.Part, errorPctBase + repetitionNr * 0.1f); } + //TODO bumi do simulate foe Q3 Calibration + /// + /// Single meters + /// + SimulateQ3CalibrationData(test,1, 0, -5.1f); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.Completed)); Bridge.OnTestCompleted(this, new TestCompletedEventArgs(test.Name, BatchRslts.GetTestRslt(Results.Utils.GetTestName(test.Name, 1, 1), 0))); allResults.Info(TestResult2CsvLine(test.Name, 0)); /// Append the results to the CSV-file @@ -1520,6 +1649,64 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection return new List { TestAndLogUiCmdStop(test, e) ? Event.UiCmdStop : Event.Done }; } + private void SimulateQ3CalibrationData(Test test,int repetitionNr, int part, float errorPctBase) + { + string testName = test.Name; + string fullTestName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr); + + Results.Entities.TestRslt tstRslt = ProcessData.BatchRslts.GetTestRslt(fullTestName, part); + Results.Utils.GetCounterStates(tstRslt, Program.LocalSettings.Counters); + + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (WaterMeters.Count > i && WaterMeters[i] != null) + WaterMeters[i].SerialNr = "Simul_" + (i + 1).ToString(); + } + + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (!test.IsPartCompatible(Utils.PartNr(i + 1, BatchRslts.Batch.Compound))) continue; + + Results.Entities.MeterTestRslt meterRslt = + BatchRslts.GetEachMeterTestRslt(testName, i, Common.CompoundMeterId.Single); + if (meterRslt == null) continue; + if (meterRslt?.WaterMeter == null) continue; + if (string.IsNullOrEmpty(meterRslt.WaterMeter.SerialNr)) + { + meterRslt.WaterMeter.SerialNr = "Simul_" + (i + 1).ToString(); + meterRslt.WaterMeter.SerialNrAux = "Simul_" + (i + 1).ToString(); + log.Debug("Simul_SerialNr: " + meterRslt.WaterMeter.SerialNr); + } + + GenericDevices.IRegReader regReader = sensPath.RegisterReaders[i]; + TBF.Rig.RegisterReaders.GenesisRegReader.implementations.GenesisSmartReader GenesisSmart = + regReader as TBF.Rig.RegisterReaders.GenesisRegReader.implementations.GenesisSmartReader; + + + if (GenesisSmart != null) + { + log.Debug("GenesisSmart - store data on end!"); + int CH1 = 0, CH2 = 1, CH3 = 2; + + CalculateMeterResults(meterRslt, GenesisSmart, tstRslt, GenesisSmart.TimestampSecStart, + GenesisSmart.TimestampSecEnd, GenesisSmart.VolumeLtrStart, GenesisSmart.VolumeLtrEnd); + + //Init Calculate Calibration + GenesisSmart.RefVolume = meterRslt.VolumeRef; + GenesisSmart.RefTime = meterRslt.TestTime; + + //Store Raw Calibration Data to database + WaterMeterParentCopy(i, CH1, testName, meterRslt, GenesisSmart, tstRslt); + log.Debug($"GenesisSmart - i:{i}, CH1:{CH1}, testName:{testName}, meterRslt:{meterRslt.Id}, GenesisSmart:{GenesisSmart.Name}, tstRslt:{tstRslt.Id}"); + WaterMeterParentCopy(i, CH2, testName, meterRslt, GenesisSmart, tstRslt); + log.Debug($"GenesisSmart - i:{i}, CH2:{CH2}, testName:{testName}, meterRslt:{meterRslt.Id}, GenesisSmart:{GenesisSmart.Name}, tstRslt:{tstRslt.Id}"); + WaterMeterParentCopy(i, CH3, testName, meterRslt, GenesisSmart, tstRslt); + log.Debug($"GenesisSmart - i:{i}, CH3:{CH3}, testName:{testName}, meterRslt:{meterRslt.Id}, GenesisSmart:{GenesisSmart.Name}, tstRslt:{tstRslt.Id}"); + + } + } + } + IList Simulate2(Config.Entities.Test test, int repetitionNr, bool isLastRepetition, Compound.CombinedTestParams compoundTestParams, diff --git a/TBF/Rig/TestMethods/GenesisCommunication/CommCompletedEventArgs.cs b/TBF/Rig/TestMethods/GenesisCommunication/CommCompletedEventArgs.cs new file mode 100644 index 000000000..00e37280d --- /dev/null +++ b/TBF/Rig/TestMethods/GenesisCommunication/CommCompletedEventArgs.cs @@ -0,0 +1,40 @@ +/// +/// Copyright (c) 2015-2019 Sensus Metering Systems +/// Author: Milan Hanajík +/// +using System; +using TBF.Rig.RegisterReaders.GenesisRegReader.implementations; + +namespace TBF.Rig.TestMethods.GenesisCommunication +{ + public class CommCompletedEventArgs : EventArgs + { + public int ThreadId; + public int WMNr0; /// 0-based water meter position + public GenesisSmartReader Ihead; + public Results.Entities.WaterMeter Wm; + public string CommMessage; + public CommErr CommErr; + + public CommCompletedEventArgs(int threadId, int wmNr0, GenesisSmartReader ihead, Results.Entities.WaterMeter wm, string commMessage, CommErr commErr) + { + this.ThreadId = threadId; + this.WMNr0 = wmNr0; + this.Ihead = ihead; + this.Wm = wm; + this.CommMessage = commMessage; + this.CommErr = commErr; + } + + public override string ToString() + { + return string.Format("Thread={0} WMNr0={1} IHead={2} WM={3} CommMsg={4} CommErr={5}", + ThreadId, + WMNr0, + (Ihead != null) ? Ihead.Name : "null", + (Wm != null) ? Wm.WMPosition : -1, + (CommMessage != null) ? CommMessage : "null", + CommErr); + } + } +} diff --git a/TBF/Rig/TestMethods/GenesisCommunication/GenesisCalibrationFactors.cs b/TBF/Rig/TestMethods/GenesisCommunication/GenesisCalibrationFactors.cs new file mode 100644 index 000000000..4f072edbf --- /dev/null +++ b/TBF/Rig/TestMethods/GenesisCommunication/GenesisCalibrationFactors.cs @@ -0,0 +1,39 @@ +using System; +using System.Globalization; + +namespace TBF.Rig.TestMethods.GenesisCommunication +{ + public static class GenesisCalibrationFactors + { + // Preserve the special branch default only when no channel has been configured. + public const ushort DefaultFactor = 15625; + + public static bool TryParse(string text1, string text2, string text3, + out double[] factors, out string error) + { + factors = null; + error = null; + var text = new[] { text1, text2, text3 }; + if (Array.TrueForAll(text, string.IsNullOrWhiteSpace)) + { + factors = new double[] { DefaultFactor, DefaultFactor, DefaultFactor }; + return true; + } + + var parsed = new double[3]; + for (int channel = 0; channel < parsed.Length; channel++) + { + ushort value; + if (!ushort.TryParse(text[channel]?.Trim(), NumberStyles.None, + CultureInfo.InvariantCulture, out value) || value == 0) + { + error = "Genesis calibration Text" + (channel + 1) + " must be an integer from 1 to 65535. Set all three channels."; + return false; + } + parsed[channel] = value; + } + factors = parsed; + return true; + } + } +} diff --git a/TBF/Rig/TestMethods/GenesisCommunication/GenesisCommunicationForm.cs b/TBF/Rig/TestMethods/GenesisCommunication/GenesisCommunicationForm.cs new file mode 100644 index 000000000..1abcb57e4 --- /dev/null +++ b/TBF/Rig/TestMethods/GenesisCommunication/GenesisCommunicationForm.cs @@ -0,0 +1,1926 @@ +using TBF.Rig.TestMethods.iPerlCommunication; +/// +/// Copyright (c) 2015-2023 Sensus Slovensko a.s. +/// +//#define VERIFY_ACTIVE_MODE +//#define VERIFY_Q2_CORR_RESET + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Globalization; +using System.Linq; +using System.Threading; +using System.Windows.Forms; +using log4net; +using Common; +using Config.Entities; +using TBF.Resources; +using TBF.Rig.Sequences; +using TBF.Rig.TestMethods.iPerlCommunication.iPerlHead; +using Results.Entities; +using static Sensus.iPerl.NfcHandler.MCI_Protocol; +using System.Threading.Tasks; +using TBF.Rig.RegisterReaders.GenesisRegReader.communication; +using TBF.Rig.RegisterReaders.GenesisRegReader.implementations; +using TBF.Rig.TestMethods.GenesisCommunication; +using TBF.Rig.TestMethods.iPerlCommunication.communication; +using TBF.Rig.TestMethods.iPerlCommunication.communication.C4.diagnosticLed; +using TBF.Rig.TestMethods.iPerlCommunication.communication.C4.protocolCommons; +using TBF.Rig.Uni.SharedDialogs.SmartMetersCommunication.common; +using CommunicationInterface = TBF.Rig.TestMethods.iPerlCommunication.iPerlHead.CommunicationInterface; +using ConfigStruct = TBF.Rig.TestMethods.iPerlCommunication.iPerlHead.ConfigStruct; +using MessageID = TBF.Rig.TestMethods.iPerlCommunication.iPerlHead.MessageID; +using MeterType = TBF.Rig.TestMethods.iPerlCommunication.iPerlHead.MeterType; + +namespace TBF.Rig.TestMethods.GenesisCommunication +{ + public enum CommErr + { + None = 0, + CommFailed, /// 1 + OpenPort, /// 2 + Read, /// 3 + Read1, /// 4 + Read2, /// 5 + Read3, /// 6 + Read4, /// 7 + Write, /// 8 + ReadAfterWrite, /// 9 + CmdActive, /// 0AH = 10 + CmdTest, /// 0BH = 11 + Verify, /// 0CH = 12 + WrongIPerlType, /// 0DH = 13 + OutOfRange, /// 0EH = 14 + Q2OutOfRange, /// 0FH = 15 + MissingTest, /// 10H = 16 + RFPowerRecordMissing, /// 11H = 17 + HeadDisabledByUser, /// 12H = 18 + WrongArguments, /// 13H = 19 + FailedInit, /// 14H = 20 + FailedConnect, /// 15H = 21 + FailedReadSerialNr, /// 16H = 22 + FailedSetPassword, /// 17H = 23 + FailedLogin, /// 18H = 24 + FailedSetTestMode, /// 19H = 25 + FailedSetActiveMode, /// 1AH = 26 + FailedWriteCalibrationFactor,/// 1BH = 27 + FailedWriteRegister,/// 1CH = 28 + FailedPrepare, /// 1DH = 29 + } + + + public partial class GenesisCommunicationForm : Form, GenericDevices.IHasCompleted + { + private static readonly ILog log = LogManager.GetLogger(typeof(GenesisCommunicationForm)); + protected static readonly ILog rfidDataLogger = LogManager.GetLogger("RfidData"); + + const int Hz2CorrFactorsAddr = 0x1875; /// Used by Reset2HzCorrection(...) and Write2HzCorrection(...) + const int Q2CorrFactorsAddr = 0x1878; /// Used by ResetQ2Correction(...) and WriteQ2Correction(...) + const int Q2CorrFactorsAddrLR = 0x1878; + const int Q2CorrFactorsAddrRL = 0x1879; + + public const string SlotInitializeStr = "Initialise Slot"; + public const string SlotUpdateStr = "Update Slot"; + public const string SlotConnectStr = "Connect Slot"; + public const string SlotPCBSlotStr = "PCB Slot"; + public const string SlotSetPasswordStr = "Set Password"; + public const string SlotLoginStr = "Login"; + public const string SlotGroupedLoginStr = "Login (Combined workflow)"; + public const string SlotSetTestModeStr = "Switch to Test Mode"; + public const string SlotSetActiveModeStr ="Switch to Active Mode"; + public const string SlotDisconnectStr = "Disconnect Slot"; + public const string PrepareSlotQ3CalibrationStr = "Prepare Q3 Calibration Slot"; + public const string WriteSlotQ3CalibrationStr = "Write Q3 Calibration Slot"; + public const string CheckMeterPrepareStr = "Check Meter Prepare Slot"; + public const string HoldSlotStr = "Hold Slot"; + + public const string PrepareInitializeStr = "Initialise Prepare"; + + + + public const string ReadConfigurationStr = "Read configuration"; /// Example: "Read configuration" or "Read configuration if enabled" + public const string SetTestModeStr = "Set Test mode"; /// Example: "Set Test mode" or "Set Test mode A0" (hexadecimal number is the required 'testModeConfig' + public const string SetActiveModeStr = "Set Active mode"; + public const string ReadSerialNrStr = "Read SerialNr"; + public const string SetIdleModeStr = "Set Idle mode"; + public const string ReadCalibrationStr = "Read calibration"; + public const string ReadCalibrationV4Str = "Read calibration_V4"; + public const string WriteCalibrationFactorStr = "Write calibration factor"; + public const string WriteCalibrationV4FactorsStr = "Write calibration_V4"; + public const string NormalizeCalibrationFactorStr = "Normalize calibration factor"; + public const string NormalizeCalibrationV4FactorsStr = "Normalize calibration_V4"; + public const string GetDefaultQ2CorrectionsStr = "Get default Q2 corrections"; + public const string ReadQ2CorrectionStr = "Read Q2 corrections"; + public const string ResetQ2CorrectionStr = "Reset Q2 correction"; + public const string WriteDefaultQ2CorrectionsStr = "Write default Q2 corrections"; + public const string InitOrReadQ2CorrectionsStr = "Init or read Q2 corrections"; + public const string WriteQ2CorrectionStr = "Write Q2 correction"; /// No arguments + public const string WriteQ2CorrectionAltStr = "Write Q2 correction Alt"; /// No arguments + public const string WriteQ2CorrectionGreeceStr = "Write Q2 correction Greece"; /// Arguments: test_name + public const string WriteQ2CorrectionRLStr = "Write Q2 correction R-L"; /// Arguments: test_name + public const string WriteQ2CorrectionLRStr = "Write Q2 correction L-R"; /// Arguments: test_name + public const string WriteQ2CorrectionIncl05Str = "Write_Q2_correction_incl.-0,5..0,5%"; /// No arguments + public const string WriteQ2CorrectionAltIncl05Str = "Write_Q2_correction_Alt_incl.-0,5..0,5%"; /// No arguments + public const string WriteQ2CorrectionPlusIncl05Str = "Write_Q2_correction_plus_incl.-0,5..0,5%"; /// No arguments + public const string WriteQ2CorrectionPlusAltIncl05Str = "Write_Q2_correction_plus_Alt_incl.-0,5..0,5%"; /// No arguments + public const string WriteQ2CorrectionGreeceIncl05Str = "Write_Q2_correction_Greece_incl.-0,5..0,5%"; /// Arguments: test_name + public const string WriteQ2CorrectionRLIncl05Str = "Write_Q2_correction_R-L_incl.-0,5..0,5%"; /// Arguments: test_name + public const string WriteQ2CorrectionLRIncl05Str = "Write_Q2_correction_L-R_incl.-0,5..0,5%"; /// Arguments: test_name + public const string UpdateBothQ2FactorsTestRLOnlyStr = "Update_both_Q2_factors_Test_RL_only"; /// No arguments + public const string UpdateBothQ2FactorsTestLROnlyStr = "Update_both_Q2_factors_Test_LR_only"; /// No arguments + public const string UpdateQ2CorrectionsStr = "Update Q2 corrections"; /// Arguments: R-L_test_name L-R_test_name + public const string ConditnlUpdateQ2CorrectionsStr = "Conditional update of Q2 corrections"; /// Arguments: R-L_test_name L-R_test_name + public const string ConditnlUpdateQ2CorrRLStr = "Conditional update of Q2 correction R-L"; /// Arguments: R-L_test_name + public const string ConditnlUpdateQ2CorrLRStr = "Conditional update of Q2 correction L-R"; /// Arguments: L-R_test_name + public const string Reset2HzCorrectionStr = "Reset 2Hz correction"; + public const string Write2HzCorrectionStr = "Write 2Hz correction"; + public const string DewaReworkRLStr = "DEWA rework R-L"; + public const string DewaReworkLRStr = "DEWA rework L-R"; + public const string StartTestingSealedMetersStr = "Start testing sealed meters"; + public const string EndTestingSealedMetersStr = "End testing sealed meters"; + public const string SimulateCmd = "simulate "; + + public static Color DisabledColor = Color.DarkGray; + public static Color OptoAndDirOKColor = Color.Green; + public static Color OptoNokColor = Color.Orange; + public static Color DirNokColor = Color.Red; + + + #region Simulation / RFID / NFC Interface: ReadRequestPort, WriteRequestPort + /// + /// Wrapper function with safe interface and unsafe body + /// + /// Water meter (iPerlHead) object + /// Value returned by readRequestPort(...) + + + /// + /// Wrapper function with safe interface and unsafe body + /// + /// Water meter (iPerlHead) object + /// Value returned by writeRequestPort(...) + + #endregion iPerl_Head_RFID_Interface: ReadRequestPort, WriteRequestPort + + + readonly bool checkBoxesEditMode; + + DateTime startTime; + int startTimeSec; + + + // Set to 'true' when the form closes + public bool Completed { get { return formCompleted; } } + bool formCompleted; + + bool forcedClose; /// Set in the forced close handler + + + /// Number of text boxes for serial numbers + public int WaterMetersCount; + + const int MaxTextBoxesCount = 48; + int textBoxesCount; + + Label[] labels; + PictureBox[] counters; + TextBox[] messages; + CheckBoxImage[] checkBoxes; + static int[] ckbIndex; + static bool[] ckbState; + + static IList genesisHeads; + static IList waterMeterPositions0; /// keeps original 0-based indices in RegisterReaders list + static int commonWMType; + + + /// + /// RFID multiplexer PCB / RFID serial port and worker thread related variables + /// + static TestMethod testMethod; + public static TestMethodCfg cfg; + static IList tests; + static IList multiTestParams; + + + static int currentActivityStep; + static int currentGroup; /// form -> worker thread (0 = none) + static int lastGroup; + static int completedCommCount; /// Number of completed communication steps + + static IList workerThreads; + static IList muxBrdOrGroup14Nrs; + static bool stopWorkerThreads; /// form -> worker thread + + + /// Parameterless constructor (without watermeters, threads) + public GenesisCommunicationForm() + { + InitializeComponent(); + } + + /// + /// Constructor for checkBox states (active/inactive iPerl head) editing. + /// + /// Initial check box states + public GenesisCommunicationForm(bool isCheckBoxesEditMode) + : this() + { + GenesisCommunicationForm.cfg = new TestMethodCfg(null); // default iPerl Head communication params + if (isCheckBoxesEditMode) + { + checkBoxesEditMode = true; + saveButton.Visible = true; + activityLabel.Text = Strings.Optical_heads; + ShuffleTextBoxes(ProcessData.WMsCount, ProcessData.LineSize); + +#if IPERL + ContextMenu cm = new ContextMenu(); + ////////////////////////////////////////////////////////////////////// + cm.MenuItems.Add(NewMenuItem("Initialise Slot" , "Initialize")); + // cm.MenuItems.Add(NewMenuItem("Update Slot" , "Update")); + // cm.MenuItems.Add(NewMenuItem("Connect Slot" , "Connect")); + cm.MenuItems.Add(NewMenuItem("Login (Combined)" , "Login (Combined)")); + cm.MenuItems.Add(NewMenuItem("PCB Slot" , "PCBSlot")); + // cm.MenuItems.Add(NewMenuItem("Set Password" , "SetPassword")); + // cm.MenuItems.Add(NewMenuItem("Login" , "Login")); + cm.MenuItems.Add(NewMenuItem("Switch to Test Mode" , "SetTestMode")); + cm.MenuItems.Add(NewMenuItem("Switch to Active Mode" , "SetActiveMode")); + ///////////////////////////////////////////////////////////////////// + this.ContextMenu = cm; +#endif + } + } + + + /// + /// Constructor for one iPerlCommunication 'test' + /// + /// Number of text boxes for serial numbers + public GenesisCommunicationForm(TestMethod testMethod, Test test, iPerlCommunicationParams testParams) + : this(testMethod, new List { test }, new List { testParams }) + { + } + + /// + /// Constructor for multiple iPerlCommunication 'tests' + /// + /// Number of text boxes for serial numbers + public GenesisCommunicationForm(TestMethod testMethod, IList tests, IList multiTestParams) + : this() + { + checkBoxesEditMode = false; + + GenesisCommunicationForm.testMethod = testMethod; + GenesisCommunicationForm.cfg = testMethod.Cfg as TestMethodCfg; + GenesisCommunicationForm.tests = tests; + GenesisCommunicationForm.multiTestParams = multiTestParams; + + if (multiTestParams.Count > 0) + { + ProcessData.RegisterReaders = StateMachine.GetMetersPath(tests[0]).RegisterReaders; + activityLabel.Text = multiTestParams[0].Activity; + foreach (var p in multiTestParams) + { + if (p.Activity.ToLower() == GetDefaultQ2CorrectionsStr.ToLower()) + { + /// Reset IsQ2PreCorrectionCalculated that is used for synchronization/to prevent double REST call + ProcessData.IsQ2PreCorrectionCalculated = false; + commonWMType = 0; + break; + } + } + } + + PrepareForTestsActivities(); + } + + private bool CanUseUi() + { + return !IsDisposed && !Disposing && IsHandleCreated; + } + + void PrepareForTestsActivities() + { + startTime = DateTime.Now; + startTimeSec = StateMachine.Time; + + /// Attach to 'CommCompleted' handler + CommCompletedHandler += delegate(object sender, CommCompletedEventArgs args) + { + if (!CanUseUi()) return; + + if (InvokeRequired) + { + try + { + BeginInvoke(new EventHandler((s, a) => + { + if (!CanUseUi()) return; + DoOnCommCompleted(s, a); + }), sender, args); + } + catch (ObjectDisposedException) { } + catch (InvalidOperationException) { } + } + else + { + DoOnCommCompleted(sender, args); + } + }; + + /// Attach to 'AllCompleted' handler + AllCompletedHandler += delegate(object sender, AllCompletedEventArgs args) + { + if (IsDisposed || Disposing || !IsHandleCreated) + return; + + if (InvokeRequired) + { + try + { + BeginInvoke(new EventHandler((s, a) => + { + if (IsDisposed || Disposing) + return; + + DoOnAllCompleted(s, a); + + }), sender, args); + } + catch (ObjectDisposedException) { } + catch (InvalidOperationException) { } + } + else + { + DoOnAllCompleted(sender, args); + } + }; + + formCompleted = false; + StartForceCloseHandler(); + + + genesisHeads = new List(); + waterMeterPositions0 = new List(); + /// + for (int wmPos = 0; wmPos < ProcessData.RegisterReaders.Length; wmPos++) + { + GenesisSmartReader genesisSmartReader = ProcessData.RegisterReaders[wmPos] as GenesisSmartReader; + + if (genesisSmartReader != null) + { + genesisHeads.Add(genesisSmartReader); + waterMeterPositions0.Add(wmPos); + } + } + + WaterMetersCount = genesisHeads.Count; + ShuffleTextBoxes(WaterMetersCount, ProcessData.LineSize); + + /// + /// Prepare worker threads, 'rfidPortNrs', 'lastGroup', etc.. + /// + currentActivityStep = 0; + currentGroup = 0; + completedCommCount = 0; + stopWorkerThreads = false; + + /// group numbers are >=1, lastGroup == 0 means there is no group + lastGroup = 0; + foreach (var iPerl in GenesisCommunicationForm.genesisHeads) + { + if (iPerl.Group > lastGroup) lastGroup = iPerl.Group; + } + + workerThreads = new List(); + for (int i = 0; i < cfg.NrThreads; i++) + { + Thread thread = new Thread(Worker); + thread.CurrentCulture = CultureInfo.CurrentCulture; + thread.CurrentUICulture = CultureInfo.CurrentUICulture; + workerThreads.Add(thread); + } + + muxBrdOrGroup14Nrs = new List(); + foreach (var iPerl in GenesisCommunicationForm.genesisHeads) + { + if (!muxBrdOrGroup14Nrs.Contains(iPerl.MuxBoardNrOrGroup14)) muxBrdOrGroup14Nrs.Add(iPerl.MuxBoardNrOrGroup14); + } + + log.WarnFormat("nrThreads = {0}", workerThreads.Count); + } + + /// + /// Make sure the layout of labels/text boxes on the screen + /// corresponds to the layout of watermeters of the test bench. + /// + /// Number of watermeters + /// Number of watermeters in one line + void ShuffleTextBoxes(int wmsCount, int lineSize) + { + labels = new Label[MaxTextBoxesCount] + { + wmLabel1, wmLabel2, wmLabel3, wmLabel4, wmLabel5, wmLabel6, wmLabel7, wmLabel8, wmLabel9, wmLabel10, + wmLabel11, wmLabel12, wmLabel13, wmLabel14, wmLabel15, wmLabel16, wmLabel17, wmLabel18, wmLabel19, wmLabel20, + wmLabel21, wmLabel22, wmLabel23, wmLabel24, wmLabel25, wmLabel26, wmLabel27, wmLabel28, wmLabel29, wmLabel30, + wmLabel31, wmLabel32, wmLabel33, wmLabel34, wmLabel35, wmLabel36, wmLabel37, wmLabel38, wmLabel39, wmLabel40, + wmLabel41, wmLabel42, wmLabel43, wmLabel44, wmLabel45, wmLabel46, wmLabel47, wmLabel48, + }; + counters = new PictureBox[MaxTextBoxesCount] + { + pictureBox1, pictureBox2, pictureBox3, pictureBox4, pictureBox5, pictureBox6, pictureBox7, pictureBox8, pictureBox9, pictureBox10, + pictureBox11, pictureBox12, pictureBox13, pictureBox14, pictureBox15, pictureBox16, pictureBox17, pictureBox18, pictureBox19, pictureBox20, + pictureBox21, pictureBox22, pictureBox23, pictureBox24, pictureBox25, pictureBox26, pictureBox27, pictureBox28, pictureBox29, pictureBox30, + pictureBox31, pictureBox32, pictureBox33, pictureBox34, pictureBox35, pictureBox36, pictureBox37, pictureBox38, pictureBox39, pictureBox40, + pictureBox41, pictureBox42, pictureBox43, pictureBox44, pictureBox45, pictureBox46, pictureBox47, pictureBox48, + }; + messages = new TextBox[MaxTextBoxesCount] + { + wmTextBox1, wmTextBox2, wmTextBox3, wmTextBox4, wmTextBox5, wmTextBox6, wmTextBox7, wmTextBox8, wmTextBox9, wmTextBox10, + wmTextBox11, wmTextBox12, wmTextBox13, wmTextBox14, wmTextBox15, wmTextBox16, wmTextBox17, wmTextBox18, wmTextBox19, wmTextBox20, + wmTextBox21, wmTextBox22, wmTextBox23, wmTextBox24, wmTextBox25, wmTextBox26, wmTextBox27, wmTextBox28, wmTextBox29, wmTextBox30, + wmTextBox31, wmTextBox32, wmTextBox33, wmTextBox34, wmTextBox35, wmTextBox36, wmTextBox37, wmTextBox38, wmTextBox39, wmTextBox40, + wmTextBox41, wmTextBox42, wmTextBox43, wmTextBox44, wmTextBox45, wmTextBox46, wmTextBox47, wmTextBox48, + }; + checkBoxes = new CheckBoxImage[MaxTextBoxesCount] + { + checkBoxImage1, checkBoxImage2, checkBoxImage3, checkBoxImage4, checkBoxImage5, checkBoxImage6, checkBoxImage7, checkBoxImage8, checkBoxImage9, checkBoxImage10, + checkBoxImage11, checkBoxImage12, checkBoxImage13, checkBoxImage14, checkBoxImage15, checkBoxImage16, checkBoxImage17, checkBoxImage18, checkBoxImage19, checkBoxImage20, + checkBoxImage21, checkBoxImage22, checkBoxImage23, checkBoxImage24, checkBoxImage25, checkBoxImage26, checkBoxImage27, checkBoxImage28, checkBoxImage29, checkBoxImage30, + checkBoxImage31, checkBoxImage32, checkBoxImage33, checkBoxImage34, checkBoxImage35, checkBoxImage36, checkBoxImage37, checkBoxImage38, checkBoxImage39, checkBoxImage40, + checkBoxImage41, checkBoxImage42, checkBoxImage43, checkBoxImage44, checkBoxImage45, checkBoxImage46, checkBoxImage47, checkBoxImage48, + }; + ckbIndex = new int[MaxTextBoxesCount]; + ckbState = new bool[MaxTextBoxesCount]; + + + textBoxesCount = MaxTextBoxesCount; + /// + if (wmsCount < textBoxesCount && lineSize > 0) + { + int nrLines = (wmsCount + lineSize - 1) / lineSize; + int gap = (textBoxesCount - wmsCount) / nrLines; + + for (int i = 0; i < ckbIndex.Length; i++) + { + ckbIndex[i] = -1; /// Initialize with invalid indices + } + + int dest = 0; + for (int l = 0; l < nrLines; l++) + { + for (int i = 0; i < lineSize; i++) + { + int origin = l * lineSize + l * gap + i; + labels[dest] = labels[origin]; + counters[dest] = counters[origin]; + messages[dest] = messages[origin]; + checkBoxes[dest] = checkBoxes[origin]; + ckbIndex[origin] = dest; + dest++; + } + } + + textBoxesCount = wmsCount; + } + + int count = checkBoxesEditMode ? textBoxesCount : Math.Min(textBoxesCount, genesisHeads.Count); + for (int j = 0; j < count; j++) + { + labels[j].Text = (j + 1).ToString(); + } + + ResizeDlgToFitEnabledControls(); + } + + void ResizeDlgToFitEnabledControls() + { + int xMax = 0; + int yMax = 0; + for (int i = 0; i < textBoxesCount; i++) + { + if (messages[i].Left + messages[i].Width > xMax) xMax = messages[i].Left + messages[i].Width; + if (messages[i].Top + messages[i].Height > yMax) yMax = messages[i].Top + messages[i].Height; + } + Width = xMax + 50; + Height = yMax + 60; + } + + + void Localize() + { + Text = checkBoxesEditMode ? Strings.Optical_heads : Strings.Water_Meter_States; + saveButton.Text = Strings.Save; + + sampleLabel1.Text = Strings.Direction_and_pulses_are_OK; + sampleLabel2.Text = Strings.There_are_no_opto_pulses; + sampleLabel3.Text = Strings.Direction_is_NOK; + + samplePictureBox1.BackColor = OptoAndDirOKColor; + samplePictureBox2.BackColor = OptoNokColor; + samplePictureBox3.BackColor = DirNokColor; + } + + + private void GenesisCommunicationForm_Load(object sender, EventArgs e) + { + Localize(); + + if (checkBoxesEditMode) + { + /// Check box edit mode => Hide explanation of activity colours + sampleLabel1.Visible = false; + sampleLabel2.Visible = false; + sampleLabel3.Visible = false; + samplePictureBox1.Visible = false; + samplePictureBox2.Visible = false; + samplePictureBox3.Visible = false; + } + + /// + /// Set checkbox states accroding to iPerlHeads[i].Disabled states + /// + for (int i = 0; i < textBoxesCount; i++) + { + labels[i].Visible = counters[i].Visible = messages[i].Visible = checkBoxes[i].Visible = true; + + if (!checkBoxesEditMode && (genesisHeads[i] == null || genesisHeads[i].Disabled)) + { + /// iPerl position i+1 is disabled + checkBoxes[i].Enabled = checkBoxes[i].Checked = ckbState[i] = false; + counters[i].BackColor = DisabledColor; + messages[i].Text = Strings.Head_was_disabled_by_the_user; + } + else + { + /// iPerl position i+1 is enabled + checkBoxes[i].Enabled = checkBoxes[i].Checked = ckbState[i] = true; + messages[i].Text = "---"; + } + } + + /// + /// Set location and checkbox states to values stored in local settings + /// + TBF.LocalSettings ls = Program.LocalSettings; + Left = (ls.iPerlCommunicationsFormLeft != 0) ? ls.iPerlCommunicationsFormLeft : 150; + Top = (ls.iPerlCommunicationsFormTop != 0) ? ls.iPerlCommunicationsFormTop : 150; + SetCheckBoxStates(ls.OptoHeadsEnabled); + + if (!checkBoxesEditMode) + { + /// Regular activity (not a checkbox edit mode invoked from TBF menu) + + /// Reset opto-data indication + for (int i = 0; i < genesisHeads.Count; i++) + { + counters[i].BackColor = OptoNokColor; + } + + /// Start communication process by incrementing 'currentGroup'. + currentGroup++; + + int wtId = 0; + foreach (var wt in workerThreads) + { + wt.Start(new Boxes.IntBox(wtId++)); /// Start worker threads !!! + } + } + } + + + private void NormalClose() + { + CommCompletedHandler = null; + AllCompletedHandler = null; + + if (multiTestParams != null && + multiTestParams.Count > 0 && + !multiTestParams[0].SimultWithNext) /// RFID Communication at the end of the cycle does not influence the result + { + UpdateRfidCommResult(tests); /// TODO: Pass the test info in a correct way + } + + long checkboxStates = GetCheckBoxStates(); + if (Program.LocalSettings.iPerlCommunicationsFormLeft != Location.X || + Program.LocalSettings.iPerlCommunicationsFormTop != Location.Y || + Program.LocalSettings.OptoHeadsEnabled != checkboxStates) + { + /// Update local settings + Program.LocalSettings.iPerlCommunicationsFormLeft = Location.X; + Program.LocalSettings.iPerlCommunicationsFormTop = Location.Y; + Program.LocalSettings.OptoHeadsEnabled = checkboxStates; + Program.LocalSettings.Save(); + } + + formCompleted = true; + + DialogResult = DialogResult.OK; + Close(); + } + + + #region Forced close handling + + public void StartForceCloseHandler() + { + UiBridge.Bridge.CloseModelessFormHandler += delegate(object sender, EventArgs args) + { + if (InvokeRequired) { Invoke(new EventHandler(OnForceClose), sender, args); } + else OnForceClose(sender, args); + }; + } + + void OnForceClose(object sender, EventArgs args) + { + CommCompletedHandler = null; + AllCompletedHandler = null; + + stopWorkerThreads = true; + forcedClose = true; + + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + + + private static int _messageBoxActive = 0; + + // blocked while MessageBox is active + private static readonly ManualResetEventSlim _messageBoxDone = + new ManualResetEventSlim(true); + + /// + /// Worker thread + /// + /// Thread ID (integer) wrapped into IntBox + void Worker(object threadData) + { + int threadID = (threadData as Boxes.IntBox).Val; + + int activityStep = 0; /// activity step > 0 in case multiTestParams are used + + for (int i = 0; i < multiTestParams.Count; i++ ) + { + Test currentTest = tests[i]; + iPerlCommunicationParams currentTestParams = multiTestParams[i]; + string currentActivity = currentTestParams.Activity; /// Current activity + + TBF.UiBridge.TestProgressEventArgs.SetEstimatedTimes(new int[] { 0, 0, 10, 0, 140, 0, 0, 0 }); + TBF.UiBridge.Bridge.OnTestProgress(null, new TBF.UiBridge.TestProgressEventArgs(tests[i], Progress.JustStarted)); + + + if (threadID == 0) + { + /// Check whether previous activity was 'Set test mode A0' or 'A4' + if (i > 0 && multiTestParams[i - 1].Activity.ToLower().Contains(SetTestModeStr.ToLower()) && !multiTestParams[i - 1].Activity.Contains("80")) + { + /// Start processing of opto-datastreams from all iPERL-s + int count = 0; + for (int wmNr0 = 0; wmNr0 < genesisHeads.Count; wmNr0++) + { + WaterMeter wm = (ProcessData.BatchRslts.Batch.WaterMeters != null && ProcessData.BatchRslts.Batch.WaterMeters.Count > wmNr0) + ? ProcessData.BatchRslts.Batch.WaterMeters[wmNr0] : null; + + GenesisSmartReader ihead = genesisHeads[wmNr0]; + + if (ihead != null && wm != null && !wm.Disabled) + { + lock (ihead) + { + ihead.StartDataStreamProcessing(); + count++; + } + } + } + log.WarnFormat("End of activity '{0}', StartDataStreamProcessing() of {1} heads was called.", multiTestParams[i - 1].Activity, count); + } + + /// A new activity starts - information into RFID data log + rfidDataLogger.InfoFormat(""); + rfidDataLogger.WarnFormat("Activity = {0}", currentActivity); + rfidDataLogger.InfoFormat(""); + } + + //HOLD ON - if activity is like HoldSlotStr, ignore loop and do activity like HoldSlotStr + if (currentActivity.ToLower().Equals(HoldSlotStr.ToLower())) + { + + log.Debug($"Activity '{currentActivity}' is HoldSlotStr, skipping loop and performing HoldOn operation. Thread: {threadID}"); + + CommErr error; + string resultStr = string.Empty; + error = HoldOn(threadID, ref resultStr); // wait for the hold on to complete - one time for each thread + ProcessWaterMetersDialogConfirmation(threadID, resultStr,error); + return; + } + + for (int group = 1; group <= lastGroup; group++) + { + /// Synchronize with QuidoRS and other threads + while (((group != currentGroup) || (activityStep != currentActivityStep)) && !stopWorkerThreads) + { + Thread.Sleep(50); + } + + if (stopWorkerThreads) break; + +#if TURA_SPECIAL + int threadIx = threadID; /// Just one thread for TURA_SPECIAL +#else + for (int threadIx = threadID; threadIx < threadID + 10; threadIx += cfg.NrThreads)// - max threads = 4 => 10 +#endif + { + bool wmFound = false; + + for (int wmNr0 = 0; wmNr0 < genesisHeads.Count; wmNr0++) + { + GenesisSmartReader ihead = genesisHeads[wmNr0]; + if ((ihead.Group == group) && (threadIx < muxBrdOrGroup14Nrs.Count) && (ihead.MuxBoardNrOrGroup14 == muxBrdOrGroup14Nrs[threadIx])) + { + wmFound = true; + + WaterMeter wm = null; + if (ProcessData.BatchRslts.Batch.WaterMeters != null) + { + foreach (var w in ProcessData.BatchRslts.Batch.WaterMeters) + { + if (w.WMPosition == wmNr0 + 1) + { + wm = w; + break; + } + } + } + + CommErr error; + string resultStr = string.Empty; + + /// + /// RFID communication activity call + /// + if ((ihead == null) || ihead.Disabled || !ckbState[wmNr0]) error = CommErr.HeadDisabledByUser; +#if IPERL + else if (currentActivity.ToLower().Equals(SlotInitializeStr.ToLower())) error = SlotInitialize(threadID, ihead, ref resultStr); + else if (currentActivity.ToLower().Equals(SlotUpdateStr.ToLower())) error = SlotUpdate(threadID, ihead, ref resultStr); + else if (currentActivity.ToLower().Equals(SlotConnectStr.ToLower())) error = SlotConnect(threadID, ihead, ref resultStr); + else if (currentActivity.ToLower().Equals(SlotPCBSlotStr.ToLower())) error = SlotPCBSlot(threadID, ihead, ref resultStr); + else if (currentActivity.ToLower().Equals(SlotSetPasswordStr.ToLower())) error = SlotSetPassword(threadID, ihead, ref resultStr); + else if (currentActivity.ToLower().Equals(SlotLoginStr.ToLower())) error = SlotLogin(threadID, ihead, ref resultStr); + else if (currentActivity.ToLower().Equals(SlotGroupedLoginStr.ToLower())) error = SlotGroupedLogin(threadID, ihead, ref resultStr); + else if (currentActivity.ToLower().Equals(SlotSetTestModeStr.ToLower())) error = SlotSetTestMode(threadID, ihead, ref resultStr); + else if (currentActivity.ToLower().Equals(SlotSetActiveModeStr.ToLower()))error = SlotSetActiveMode(threadID, ihead, ref resultStr); + else if (currentActivity.ToLower().Equals(SlotDisconnectStr.ToLower())) error = SlotDisconnect(threadID, ihead, ref resultStr); + else if (currentActivity.ToLower().Equals(PrepareSlotQ3CalibrationStr.ToLower())) error = PrepareSlotQ3Calibration(threadID, ihead,wm, currentTest, tests , ref resultStr); + else if (currentActivity.ToLower().Equals(WriteSlotQ3CalibrationStr.ToLower())) error = WriteSlotQ3Calibration(threadID, ihead, wm, currentTest, tests, ref resultStr); + else if (currentActivity.ToLower().Equals(CheckMeterPrepareStr.ToLower())) error = CheckMeterPrepare(threadID, ihead, ref resultStr); + + //TODO MAREK dorobit dalsie moznosti podla vzoru + + else if (currentActivity.ToLower().Contains(ReadSerialNrStr.ToLower())) error = ReadSerialNr(threadID, ihead, ref resultStr); + else if (currentActivity.ToLower().Contains(SetTestModeStr.ToLower())) error = SetTestMode(threadID, ihead, ref resultStr); + else if (currentActivity.ToLower().Equals(SetActiveModeStr.ToLower())) error = SetActiveMode(threadID, ihead, ref resultStr); + else if (currentActivity.ToLower().Equals(SetIdleModeStr.ToLower())) error = SetIdleMode(threadID, ihead, ref resultStr); + else if (currentActivity.ToLower().Contains(ReadConfigurationStr.ToLower())) error = ReadConfiguration(ihead, wm, ref resultStr); + /// + /// RFID communication functions below require a reference to water meter entity (wm != null) + /// + else if (wm == null) error = CommErr.CommFailed; + else if (currentActivity.ToLower().Contains(SimulateCmd.ToLower())) error = Simulate(ihead, wm, ref resultStr); +#endif + else + { + error = CommErr.None; + + ConditionID id = ConditionID.Count; +#if IPERL + for (id = ConditionID.A; id < ConditionID.Count; id++) + { + if (currentActivity.ToLower() == string.Format(SequenceConditionOp.ConditionNameFmt, id).ToLower()) + { + error = SetIperlCommMilestoneReached(testMethod, id, ref resultStr); + break; + } + } +#endif + if (id == ConditionID.Count) + { + resultStr = "Invalid activity"; /// No activity or milestone + } + } + + /// + /// Process the result of RFID communication activity + /// + if (error == CommErr.HeadDisabledByUser || !ckbState[wmNr0]) + { + OnCommCompleted(null, new CommCompletedEventArgs(threadID, wmNr0, ihead, wm, Strings.Head_was_disabled_by_the_user, CommErr.HeadDisabledByUser)); + } + else if (error == CommErr.None) + { + OnCommCompleted(null, new CommCompletedEventArgs(threadID, wmNr0, ihead, wm, resultStr, CommErr.None)); + } + else if ((error == CommErr.OutOfRange) || (error == CommErr.Q2OutOfRange)) + { + OnCommCompleted(null, new CommCompletedEventArgs(threadID, wmNr0, ihead, wm, resultStr, CommErr.CommFailed)); + } + else if ((error == CommErr.FailedInit) || + (error == CommErr.FailedConnect)|| + (error == CommErr.FailedReadSerialNr)|| + (error == CommErr.FailedSetPassword)|| + (error == CommErr.FailedLogin)|| + (error == CommErr.FailedSetTestMode)|| + (error == CommErr.FailedSetActiveMode)|| + (error == CommErr.FailedWriteRegister)|| + (error == CommErr.FailedWriteCalibrationFactor) || + (error == CommErr.FailedPrepare) + ) + { + OnCommCompleted(null, new CommCompletedEventArgs(threadID, wmNr0, ihead, wm, resultStr, error)); + } + else if (ihead.CommFailed || (error == CommErr.CommFailed)) + { + ihead.CommFailed = true; + + if (wm != null && (wm.ResultCode & (int)Results.Entities.ResultCode.RfidErrorCodeMask) == 0) + { + wm.ResultCode |= (((int)error << 16) | ((int)tests[i].ItemNr << 20)); + } + + OnCommCompleted(null, new CommCompletedEventArgs(threadID, wmNr0, ihead, wm, Strings.Radio_Communication_failed, error)); + } + else + { + ihead.CommFailed = true; + + if (wm != null && (wm.ResultCode & (int)Results.Entities.ResultCode.RfidErrorCodeMask) == 0) + { + wm.ResultCode |= (((int)error << 16) | ((int)tests[i].ItemNr << 20)); + } + + string failureCauseLocal = string.Format(Strings.failed_0_1_exclamation, currentActivity, error); + rfidDataLogger.ErrorFormat("Group={0}, Board={1}, {2}", currentGroup, ihead.MuxBoardNrOrGroup14, failureCauseLocal); + + OnCommCompleted(null, new CommCompletedEventArgs(threadID, wmNr0, ihead, wm, failureCauseLocal, error)); + } + + break; + } + + TBF.UiBridge.Bridge.OnTestProgress(null, new TBF.UiBridge.TestProgressEventArgs(tests[i], Progress.FlowSetting)); + } + + if (!wmFound) + { + OnCommCompleted(null, new CommCompletedEventArgs(threadID, -1, null, null, string.Empty, CommErr.None)); /// Send negative wmNr + } + + Thread.Sleep( 2000); + + if (stopWorkerThreads) break; + } + + if (stopWorkerThreads) break; + } /// for (int group + + TBF.UiBridge.Bridge.OnTestProgress(null, new TBF.UiBridge.TestProgressEventArgs(tests[i], Progress.Completed)); + activityStep++; + + if (stopWorkerThreads) break; + } + } + + + private CommErr CheckMeterPrepare(int threadId, GenesisSmartReader iHead, ref string resultStr) + { + CommErr error = CommErr.FailedWriteRegister; + var gciFullLoginResult = iHead.OptoHeadTest.CheckMeterPrepare(); + if (!string.IsNullOrEmpty(resultStr) && resultStr.Equals(TBF.Rig.RegisterReaders.GenesisRegReader.communication.OptoHeadTest.ResultOk)) + { + log.Debug("CheckMeterPrepare successful"); + resultStr = string.Format($"Check Meter Prepare: OK"); + // note Q3 calibration is done + error = CommErr.None; + } + else + { + resultStr = "Check Meter Prepare: Failed"; + } + return error; + } + + /// + /// Set the state messages in WaterMeters Dialog Confirmation + /// Use after HoldOn() + /// + /// + /// + private static void ProcessWaterMetersDialogConfirmation(int threadID, string resultStr, CommErr commErr) + { + bool wmFound = false; + for (int wmNr0 = 0; wmNr0 < genesisHeads.Count; wmNr0++) + { + GenesisSmartReader ihead = genesisHeads[wmNr0]; + + wmFound = true; + + WaterMeter wm = null; + if (ProcessData.BatchRslts.Batch.WaterMeters != null) + { + foreach (var w in ProcessData.BatchRslts.Batch.WaterMeters) + { + if (w.WMPosition == wmNr0 + 1) + { + wm = w; + break; + } + } + } + + OnCommCompleted(null, + new CommCompletedEventArgs(threadID, wmNr0, ihead, wm, resultStr, commErr)); + } + } + + + private CommErr HoldOn(int threadId, ref string resultStr) + { + log.InfoFormat("HoldOn() threadId={0}", threadId); + CommErr error = CommErr.CommFailed; + + // only first thread enters here + if (Interlocked.CompareExchange(ref _messageBoxActive, 1, 0) == 0) + { + try + { + // block other threads + _messageBoxDone.Reset(); + + if (this.InvokeRequired) + { + this.Invoke(new Action(() => { MessageBox.Show( this, "Confirm when you are ready to continue.", "Communication HOLD ON", MessageBoxButtons.OK, MessageBoxIcon.Information ); })); + } + else + { + MessageBox.Show( this, "Confirm when you are ready to continue.", "Communication HOLD ON", MessageBoxButtons.OK, MessageBoxIcon.Information ); + } + } + finally + { + // release all waiting threads after OK + Interlocked.Exchange(ref _messageBoxActive, 0); + _messageBoxDone.Set(); + + } + } + else + { + // other threads wait here until OK is pressed + _messageBoxDone.Wait(); + } + error = CommErr.None; + return error; + } + + private CommErr PrepareSlotQ3Calibration(int threadId, GenesisSmartReader iHead, WaterMeter wm, + Test currentTest, IList tests, ref string resultStr) + { + CommErr error = CommErr.FailedPrepare; + //TODO BUMI get Next test method + + log.InfoFormat("PrepareSlotQ3Calibration() threadId={0}", threadId); + + try + { + //there is only currecnt test method + //find all tests in Procedure and set the test method + log.Debug($"StateMachne Procedure:{StateMachine.Procedure?.Name}"); + log.Debug($"StateMachne TestInstances:{StateMachine.TestInstances?.Length}"); + IList procedureTests = StateMachine.Procedure?.Tests; + + Test NextTest = null; + bool bNextChatch = false; + foreach (Test test in procedureTests) + { + if (test.Equals(currentTest)) + { + bNextChatch = true; + continue; + } + + if (bNextChatch) + { + NextTest = test; + break; + } + } + + var gciFullLoginResult = iHead.OptoHeadTest.PrepareQ3Calibration(cfg, NextTest, wm); + log.Debug($"PrepareSlotQ3Calibration(threadId: {threadId}, iHead: {iHead?.Name}) result:{gciFullLoginResult}"); + if (!string.IsNullOrEmpty(gciFullLoginResult) && + gciFullLoginResult.Equals(TBF.Rig.RegisterReaders.GenesisRegReader.communication.OptoHeadTest.ResultOk)) + { + log.DebugFormat("PrepareQ3Calibration successfull threadId={0} head={1}", threadId, iHead?.Name); + resultStr = string.Format($"Write Q3 Calibration: OK"); + // note Q3 calibration is done + error = CommErr.None; + } + else + { + log.DebugFormat("PrepareQ3Calibration failed threadId={0} head={1}", threadId, iHead?.Name); + resultStr = "Write Q3 Calibration: Failed"; + } + + return error; + }catch (Exception ex) + { + log.ErrorFormat("PrepareSlotQ3Calibration() threadId={0}, iHead: {1}, Error: {2}", threadId,iHead, ex.Message); + return CommErr.FailedPrepare; + } + } + + private CommErr WriteSlotQ3Calibration(int threadId, GenesisSmartReader iHead, WaterMeter wm, + Test currentTest, IList tests, ref string resultStr) + { + CommErr error = CommErr.FailedWriteCalibrationFactor; + log.DebugFormat("WriteSlotQ3Calibration() threadId={0}, iHead: {1}, wm: {2}, currentTest: {3}, tests: {4}", threadId, iHead?.Name, wm?.Id, currentTest?.Name, tests?.Count); + //TODO BUMI get Before test method + try + { + //there is only currecnt test method + //find all tests in Procedure and set the test method + log.Debug($"StateMachne Procedure:{StateMachine.Procedure?.Name}"); + log.Debug($"StateMachne TestInstances:{StateMachine.TestInstances?.Length}"); + IList procedureTests = StateMachine.Procedure?.Tests; + + + Test BeforeTest = null; + + foreach (Test test in procedureTests) + { + if (test.Equals(currentTest)) + { + log.DebugFormat("WriteSlotQ3Calibration() threadId={0}, currentTest: {1}, BeforeTest: {2}", threadId, currentTest?.Name, BeforeTest?.Name); + break; + } + + BeforeTest = test; + } + + if (BeforeTest == null) + { + log.DebugFormat($"No Before test method found, we use the current test method threadId={0}, currentTest: {1}", threadId, currentTest?.Name); + BeforeTest = currentTest; + } + + var gciFullLoginResult = iHead.OptoHeadTest.WriteQ3Calibration(cfg, BeforeTest, wm); + if (!string.IsNullOrEmpty(gciFullLoginResult) && + gciFullLoginResult.Equals(TBF.Rig.RegisterReaders.GenesisRegReader.communication.OptoHeadTest.ResultOk)) + { + log.Debug("SlotLogin successful"); + resultStr = string.Format($"Write Q3 Calibration: OK"); + // note Q3 calibration is done + error = CommErr.None; + } + else + { + resultStr = "Write Q3 Calibration: Failed"; + } + + return error; + } + catch (Exception ex) + { + log.ErrorFormat("WriteSlotQ3Calibration() threadId={0}, Error: {1}", threadId, ex.Message); + return CommErr.FailedWriteCalibrationFactor; + } + } + + private CommErr SlotGroupedLogin(int threadId, GenesisSmartReader iHead, ref string resultStr) + { + CommErr error = CommErr.FailedLogin; + var gciFullLoginResult = iHead.OptoHeadTest.GroupedLoginSlot(); + if (gciFullLoginResult.Success) + { + log.Debug($"SlotLogin Head:{iHead.Name} successful, PCB: {gciFullLoginResult?.PcbResult?.Result?.PcbId}"); + resultStr = string.Format($"Login OK - Serial No: {gciFullLoginResult?.PcbResult?.Result?.PcbId}"); + log.Debug($"Setting PCB: {gciFullLoginResult?.PcbResult?.Result?.PcbId} for Head: {iHead.Name}"); + iHead.SerialNr = gciFullLoginResult?.PcbResult?.Result?.PcbId; + if (iHead.ConfigStruct != null) + { + iHead.ConfigStruct.PCBNumberString = gciFullLoginResult?.PcbResult?.Result?.PcbId; + } + error = CommErr.None; + } + else + { + resultStr = "Failed Combined Login"; + } + return error; + } + + private CommErr SlotDisconnect(int threadId, GenesisSmartReader iHead, ref string resultStr) + { + CommErr error = CommErr.FailedSetActiveMode; + bool result = iHead.OptoHeadTest.TurnOffRadio(); + if (result) + { + log.Debug("SlotDisconnect successful"); + resultStr = string.Format($"Slot Disconnected: {resultStr}"); + error = CommErr.None; + } + else + { + resultStr = "Failed Disconnect Slot"; + } + return error; + } + + private CommErr SlotSetActiveMode(int threadId, GenesisSmartReader iHead, ref string resultStr) + { + CommErr error = CommErr.FailedSetActiveMode; + resultStr = iHead.OptoHeadTest.SetActiveModeSlot(); + if (!string.IsNullOrEmpty(resultStr) && resultStr.Equals(TBF.Rig.RegisterReaders.GenesisRegReader.communication.OptoHeadTest.ResultOk) ) + { + log.Debug("SlotSetActiveMode successful"); + resultStr = string.Format($"Serial No: {resultStr}"); + error = CommErr.None; + } + else + { + resultStr = "Failed Read Serial No"; + } + return error; + } + + private CommErr SlotSetTestMode(int threadId, GenesisSmartReader iHead, ref string resultStr) + { + CommErr error = CommErr.FailedSetTestMode; + resultStr = iHead.OptoHeadTest.SetTestModeSlot(); + if (!string.IsNullOrEmpty(resultStr) && resultStr.Equals(TBF.Rig.RegisterReaders.GenesisRegReader.communication.OptoHeadTest.ResultOk)) + { + log.Debug("SlotSetTestMode successful"); + resultStr = string.Format($"SlotSetTestMode: {resultStr}"); + error = CommErr.None; + } + else + { + resultStr = "Failed Set Test Mode"; + } + return error; + } + + private CommErr SlotLogin(int threadId, GenesisSmartReader iHead, ref string resultStr) + { + CommErr error = CommErr.FailedLogin; + resultStr = iHead.OptoHeadTest.LoginSlot(); + if (!string.IsNullOrEmpty(resultStr) && resultStr.Equals(TBF.Rig.RegisterReaders.GenesisRegReader.communication.OptoHeadTest.ResultOk)) + { + log.Debug("SlotLogin successful"); + resultStr = string.Format($"SlotLogin: {resultStr}"); + error = CommErr.None; + } + else + { + resultStr = "Failed SlotLogin"; + } + return error; + } + + private CommErr SlotSetPassword(int threadId, GenesisSmartReader iHead, ref string resultStr) + { + CommErr error = CommErr.FailedSetPassword; + resultStr = iHead.OptoHeadTest.SetPasswordSlot(); + if (!string.IsNullOrEmpty(resultStr) && resultStr.Equals(TBF.Rig.RegisterReaders.GenesisRegReader.communication.OptoHeadTest.ResultOk)) + { + log.Debug("SlotSetPassword successful"); + resultStr = string.Format($"SlotSetPassword: {resultStr}"); + error = CommErr.None; + } + else + { + resultStr = "Failed Set Password"; + } + return error; + } + + private CommErr SlotPCBSlot(int threadId, GenesisSmartReader iHead, ref string resultStr) + { + CommErr error = CommErr.FailedReadSerialNr; + PcbReadResult pcbReadSlot = iHead.OptoHeadTest.PCB_ReadSlot(); + if (pcbReadSlot.Success) + { + var pcbId = pcbReadSlot?.PcbId; + log.Debug($"SlotPCBSlot Head:{iHead.Name} successful, PCB:{pcbId}"); + resultStr = string.Format($"SlotPCBSlot: {pcbId}"); + if (!string.IsNullOrWhiteSpace(pcbId)) + { + log.Debug($"Setting PCB: {pcbId} for Head: {iHead.Name}"); + iHead.SerialNr = pcbId; + if (iHead.ConfigStruct != null) iHead.ConfigStruct.PCBNumberString = pcbId; + } + + error = CommErr.None; + } + else + { + resultStr = "Failed SlotPCBSlot"; + } + return error; + } + + private CommErr SlotConnect(int threadId, GenesisSmartReader iHead, ref string resultStr) + { + CommErr error = CommErr.FailedConnect; + resultStr = iHead.OptoHeadTest.ConnectSlot(); + if (!string.IsNullOrEmpty(resultStr)) + { + log.Debug("SlotConnect successful"); + resultStr = string.Format($"SlotConnect: {resultStr}"); + error = CommErr.None; + } + else + { + resultStr = "Failed Connect Slot"; + } + return error; + } + + private CommErr SlotUpdate(int threadId, GenesisSmartReader iHead, ref string resultStr) + { + resultStr = iHead.OptoHeadTest.UpdateSlot(); + return CommErr.None; + } + + private CommErr SlotInitialize(int threadId, GenesisSmartReader iHead, ref string resultStr) + { + log.Debug("SlotInitialize - thrededId = " + threadId); + CommErr error = CommErr.FailedInit; + resultStr = iHead.OptoHeadTest.InitialiseSlot(); + if (!string.IsNullOrEmpty(resultStr)) + { + log.Debug("SlotInitialize successful"); + resultStr = string.Format($"SlotInitialize: {resultStr}"); + error = CommErr.None; + } + else + { + resultStr = "Failed Init Slot"; + } + return error; + } + + private CommErr ReadSerialNr(int threadId, GenesisSmartReader ihead, ref string resultStr) + { + log.Debug("ReadSerialNr threadId=" + threadId + ", ihead=" + ihead.ToString()); + if (ihead.ConfigStruct == null) + { + log.Debug("ConfigStruct is null - created new in ReadSerialNr()"); + ihead.ConfigStruct = new TBF.Rig.RegisterReaders.GenesisRegReader.implementations.ConfigStruct(); + } + if (ihead.CommFailed || ihead.ConfigStruct == null) return CommErr.CommFailed; + + //I will do communication to meter now + + CommErr error = CommErr.Read; + var result = ihead.OptoHeadTest.ReadRequest_PCB(); + if (!string.IsNullOrEmpty(result)) + { + log.Debug("ReadSerialNr successful"); + resultStr = string.Format($"Serial No: {result}"); + error = CommErr.None; + } + else + { + resultStr = "Failed Read Serial No"; + } + + return error; + } + + private CommErr SetIdleMode(int threadId, GenesisSmartReader ihead, ref string resultStr) + { + log.Debug("SetActiveMode threadId=" + threadId); + CommErr error = CommErr.CmdActive; + + /// Switch to active mode + + if (ihead.OptoHeadTest.SetIdleMode()) + { + error = CommErr.None; + } + + + if (error == CommErr.None) + { + if (ihead.ConfigStruct == null) + resultStr = "OK (Config not available)"; + else + resultStr = ihead.ConfigStruct.GetStatusModeString(); + } + + + return error; + } + + #region Communication functions + +#if IPERL + + /// + /// Read a complete configuration structure of the watermeter + /// + /// iPERL head object + /// Water meter object + /// String passed to caller + /// true on success + static CommErr ReadConfiguration(GenesisSmartReader ihead, WaterMeter wm, ref string resultStr) + { + // TODO BUMI in clasic case we need to read most of data - see ConfigStruct + + + /// + /// The activity is "Read configuration" (this enables the watermeter, resets error flag) + /// or "Read configuration if enabled" (this keeps the error flag). + /// + if (!multiTestParams[currentActivityStep].Activity.ToLower().Contains(" if enabled")) + { + ihead.CommFailed = false; + } + + if (ihead.CommFailed) return CommErr.CommFailed; + + //zeroing + ihead.ConfigStruct = null; /// Clear previous ConfigStruct, avoid reuse of (not anymore valid) PCB Number + + CommErr error = CommErr.Read; + int readRetVal = 0; + + /// Read configuration + + if (ihead.OptoHeadTest.ReadConfiguration(DiagnosticLedState.State4)) + { + error = CommErr.None; + //read, set and create ConfigStruct is set directly in method ReadConfiguration + //ihead.ConfigStruct = new ConfigStruct(); //.FromByteArray(config); + if (ihead.ConfigStruct != null) + { + resultStr = ihead.ConfigStruct.ToString(1); + } + else + { + resultStr = "Data not available"; + } + } + else + { + resultStr = "Failed to read configuration"; + } + + //return error + Math.Max(0, Math.Min(readRetVal, 4)); + return error; + } + + + /// + /// Set the watermeter to the test mode. + /// If testModeConfig is specified as a hexadeximal number appended to "set test mode ", it is verified + /// whether the testModeConfig is correctly set, if necessary it is changed to the specified value. + /// Read a part of configuration afterwards to verify the mode was set correctly. + /// + /// Thread ID passed to RFID communication functions + /// iPERL head object + /// String passed to caller + /// true on success + static CommErr SetTestMode(int threadId, GenesisSmartReader ihead, ref string resultStr) + { + log.Debug("SetTestMode threadId=" + threadId + ", ihead=" + ihead.ToString()); + if (ihead.ConfigStruct == null) + { + log.Debug("ConfigStruct is null - created new in SetTestMode()"); + ihead.ConfigStruct = new TBF.Rig.RegisterReaders.GenesisRegReader.implementations.ConfigStruct(); + } + if (ihead.CommFailed || ihead.ConfigStruct == null) return CommErr.CommFailed; + + //I will do communication to meter now + + DiagnosticLedState testModeConfig = DiagnosticLedState.State4; /// Default value + /// + + if (ihead.OptoHeadTest.SetTestMode()) + { + log.Debug($"Meter Head:{ihead.Name}, test mode activated now"); + } + + + if (ihead.ConfigStruct.MeterState == ProtocolStatuses.Active/*Test*/ && ihead.ConfigStruct.TestModeConfig == testModeConfig) + { + /// Already in the correct test mode + resultStr = "Already " + ihead.ConfigStruct.ToString(1); + log.Debug($"Meter Head:{ihead.Name}, status: {resultStr}"); + return CommErr.None; + } + + /// Communication necessary + CommErr error = CommErr.None; + + /// Now the meter should be in the Test mode ... verify + if (error == CommErr.None) + { + /// Verify the configuration + error = CommErr.Verify; + + + if ((ihead.ConfigStruct.MeterState == ProtocolStatuses.Active) && + (ihead.ConfigStruct.TestModeConfig == testModeConfig)) + { + error = CommErr.None; + resultStr = ihead.ConfigStruct.GetActiveModeString(); + } + + } + + return error; + } + + + /// + /// Set the watermeter to the active mode. + /// Read a part of configuration afterwards to verify the mode was set correctly. + /// + /// iPERL head object + /// String passed to caller + /// true on success + static CommErr SetActiveMode(int threadId, GenesisSmartReader ihead, ref string resultStr) + { + log.Debug("SetActiveMode threadId=" + threadId); + CommErr error = CommErr.CmdActive; + + /// Switch to active mode + + if (ihead.OptoHeadTest.SetActiveMode()) + { + error = CommErr.None; + } + + + if (error == CommErr.None) + { + if (ihead.ConfigStruct == null) + resultStr = "OK (Config not available)"; + else + resultStr = ihead.ConfigStruct.GetActiveModeString(); + } + + + return error; + } + + + + + /// + /// Reset both Q2 correction factors in the memory to 0. + /// Read them back to verify factors were written correctly. + /// + /// Water meter object + /// String passed to caller + /// true on success + static CommErr Simulate(GenesisSmartReader ihead, WaterMeter wm, ref string resultStr) + { + string[] arguments = multiTestParams[currentActivityStep].Activity.Split(new char[] { ' ' }); + + if (arguments.Length < 2 || arguments[1].ToLower() != "iperls") return CommErr.None; + + if (ihead.CommFailed) return CommErr.CommFailed; + + string[] pcbNrs = new string[] { "831232435539", "831232435562", + "831232435587", "831232432141", + "831232432497", "831232763641" }; + + if (wm.WMPosition > 0 && wm.WMPosition <= pcbNrs.Length) + { + ihead.SerialNr = wm.SerialNr = pcbNrs[wm.WMPosition - 1]; + } + + resultStr = string.Format("PCB Nr. = {0}", wm.SerialNr ?? ""); + return CommErr.None; + } + + + static CommErr SetIperlCommMilestoneReached(TestMethod testMethod, ConditionID id, ref string resultStr) + { + if (id < ConditionID.A || id >= ConditionID.Count) + { + resultStr = Strings.Error; + return CommErr.WrongArguments; + } + + testMethod.IperlCommMilestone[(int)id] = true; + resultStr = string.Format(SequenceConditionOp.ConditionNameFmt, id); + return CommErr.None; + } +#endif +#endregion + + /// + /// Called when communication with one watermeter is completed + /// + public static void OnCommCompleted(object sender, CommCompletedEventArgs data) + { + if (CommCompletedHandler == null) return; + try { CommCompletedHandler(sender, data); } + catch (Exception e) { log.Error("CommCompletedHandler(...) failed", e); } + } + public static event EventHandler CommCompletedHandler; + + void DoOnCommCompleted(object sender, CommCompletedEventArgs data) + { + try + { + /// + /// Update the text message + /// + if (data.WMNr0 >= 0) messages[data.WMNr0].Text = data.CommMessage; + + /// + /// Update head active/inactive switch + /// + if (data.WMNr0 >= 0 && data.CommErr == CommErr.HeadDisabledByUser) + { + /// iPerl head was disabled by the user + ckbState[data.WMNr0] = false; + checkBoxes[data.WMNr0].Checked = false; + checkBoxes[data.WMNr0].Enabled = false; + if (data.Ihead != null) data.Ihead.Disabled = true; + if (data.Wm != null) data.Wm.Disabled = true; + } + else if (data.WMNr0 >= 0 && data.CommErr == CommErr.None) + { + /// One RFID communication successful => iPerl cannot be disabled by the user anymore + ckbState[data.WMNr0] = true; + checkBoxes[data.WMNr0].Checked = true; + checkBoxes[data.WMNr0].Enabled = false; + } + // else if (data.WMNr0 >= 0 && data.CommErr != CommErr.None) + // { + // //disable if error + // ckbState[data.WMNr0] = false; + // checkBoxes[data.WMNr0].Checked = false; + // checkBoxes[data.WMNr0].Enabled = false; + // if (data.Ihead != null) data.Ihead.Disabled = true; + // if (data.Wm != null) data.Wm.Disabled = true; + // //color + // if (counters.Length > data.WMNr0) counters[data.WMNr0].BackColor = OptoNokColor; + // } + + /// + /// Update opto-communication indication + /// + for (int i = 0; i < genesisHeads.Count; i++) + { + if (genesisHeads[i] == null || genesisHeads[i].Disabled) + { + counters[i].BackColor = DisabledColor; + } + else + { + counters[i].BackColor = OptoAndDirOKColor; + /*switch (genesisHeads[i].CheckFlowDirection()) + { + case OptoHeadState.OptoAndDirOK: + counters[i].BackColor = OptoAndDirOKColor; + break; + + case OptoHeadState.DirNok: + counters[i].BackColor = DirNokColor; + break; + + default: + case OptoHeadState.OptoNok: + counters[i].BackColor = OptoNokColor; + break; + }*/ + } + } + +#if !TURA_SPECIAL + /// + /// Branch + /// + lock (this) + { + if (++completedCommCount < 4) return; + completedCommCount = 0; + } +#endif + + if (currentGroup < lastGroup) + { + /// Go to the next step / next group + currentGroup++; + } + else if (currentActivityStep + 1 < multiTestParams.Count) + { + currentGroup = 0; + currentActivityStep++; + activityLabel.Text = multiTestParams[currentActivityStep].Activity; + currentGroup++; + } + else + { + log.Debug("Wait for finish workerThreads 4 seconds"); + + Thread lastThread = workerThreads[data.ThreadId]; + + Task.Run(() => + { + lastThread.Join(2000); + + if (!CanUseUi()) return; + + BeginInvoke(new Action(async () => + { + if (!CanUseUi()) return; + + // nechaj výsledky/chyby čitateľné 4 sekundy + await Task.Delay(4000); + + if (!CanUseUi() || forcedClose) return; + + NormalClose(); + })); + }); + } + } + catch (Exception e) + { + log.ErrorFormat("DoOnCommCompleted({0}) failed: {1}", data, e.Message); + log.FatalFormat("StackTrace : {0}{1}", Environment.NewLine, e.StackTrace); + } + } + + + + public static event EventHandler AllCompletedHandler; + + void DoOnAllCompleted(object sender, AllCompletedEventArgs data) + { + Text = data.CommMessage; + } + + /// + /// Update test result representing RFID communication success/failure + /// + /// + void UpdateRfidCommResult(IList tests) + { + DateTime endTime = DateTime.Now; + int testTime = StateMachine.Time - startTimeSec; + + if (!tests.Contains(StateMachine.TestInstances[0].Test)) + { + tests.Insert(0, StateMachine.TestInstances[0].Test); /// Add RFID test as the 1st item + } + + foreach (var test in tests) + { + Results.Entities.TestRslt tstRslt = ProcessData.BatchRslts.GetTestRslt(test.Name, test.Part); + + if (tstRslt != null) + { + Results.Utils.GetCounterStates(tstRslt, Program.LocalSettings.Counters); + + /// Auxiliary results ... not required + + /// Main results + tstRslt.MethodClass = TbfComponents.FindComponent(test.Method).ClassName; + tstRslt.TestDone = true; + tstRslt.StartTime = tstRslt.Batch.StartTime; + tstRslt.EndTime = endTime; + tstRslt.FlowSetTime = 0; + tstRslt.MassOfEvapWater = 0; + tstRslt.TestTime += testTime; /// [s] total communication time of all tests + + for (int i = 0; i < genesisHeads.Count; i++) + { + Results.Entities.MeterTestRslt meterRslt = + ProcessData.BatchRslts.GetMeterTestRslt(test.Name, waterMeterPositions0[i], CompoundMeterId.Single); + + if (meterRslt != null && genesisHeads[i] != null) + { + meterRslt.WaterMeter.SerialNr = genesisHeads[i].SerialNr; + meterRslt.Passed = (!genesisHeads[i].CommFailed && !genesisHeads[i].Disabled); + meterRslt.TestDone = true; + } + } + } + } + + UiBridge.Bridge.OnTestCompleted(this, new UiBridge.TestCompletedEventArgs(string.Empty, null)); + } + +#if IPERL + private MenuItem NewMenuItem(string text, string tag) + { + MenuItem menuItem = new MenuItem { Text = text, Tag = tag }; + menuItem.Click += OnClick_Optical_Heads_Settings_Menu; + return menuItem; + } + private async void OnClick_Optical_Heads_Settings_Menu(object sender, EventArgs e) + { + MenuItem menuItem = (MenuItem)sender; + activityLabel.Text = menuItem.Text; + List tasks = new List(); + foreach (var iHead in ProcessData.SmartHeadsUni) + { + if (!checkBoxes[iHead.Position - 1].Checked) + { + if (iHead.Position - 1 < messages.Length) messages[iHead.Position - 1].Text = ""; + continue; + } + messages[iHead.Position - 1].Text = $"COM{iHead.RfidComPortNr}"; + Application.DoEvents(); // Refresh UI + tasks.Add(Task.Run(async () => + { + if (iHead is GenesisSmartReader genesisHead) + { + string result = await ProcessTask(genesisHead, menuItem.Tag); + this.Invoke((Action)(() => + { + messages[iHead.Position - 1].Text = result; + Application.DoEvents(); // Refresh UI + })); + } + + })); + + } + await Task.WhenAll(tasks); + } + + private async Task ProcessTask(GenesisSmartReader iHead, object tag) + { + string txt = ""; + bool success = false; + switch (tag) + { + //////////////////////////////////////////////////////// + case "Initialize": + txt = iHead.OptoHeadTest.InitialiseSlot(); + break; + //now unused + case "Update": + txt = iHead.OptoHeadTest.UpdateSlot(); + break; + case "Connect": + txt = iHead.OptoHeadTest.ConnectSlot(); + break; + //~now unused + case "PCBSlot": + PcbReadResult pcbReadSlot = iHead.OptoHeadTest.PCB_ReadSlot(); + txt = pcbReadSlot.Success ? pcbReadSlot.PcbId : "PCB read failed"; + break; + //now unused + case "SetPassword": + txt = iHead.OptoHeadTest.SetPasswordSlot(); + break; + case "Login": + txt = iHead.OptoHeadTest.LoginSlot(); + break; + //~ now unused + case "Login (Combined)": + var result = iHead.OptoHeadTest.GroupedLoginSlot(); + txt = result?.LoginResult?.Success ?? false ? ("Login successful; PCB: " + result?.PcbResult?.Result?.PcbId): "Login failed"; + break; + case "SetTestMode": + txt = iHead.OptoHeadTest.SetTestModeSlot(); + break; + case "SetActiveMode": + txt = iHead.OptoHeadTest.SetActiveModeSlot(); + break; + } + return txt; + } +#endif /// IPERL + + #region Check boxes edit mode support + + private void checkBoxImage1_Click(object sender, EventArgs e) { ckbState[ckbIndex[0]] = checkBoxImage1.Checked; } + private void checkBoxImage2_Click(object sender, EventArgs e) { ckbState[ckbIndex[1]] = checkBoxImage2.Checked; } + private void checkBoxImage3_Click(object sender, EventArgs e) { ckbState[ckbIndex[2]] = checkBoxImage3.Checked; } + private void checkBoxImage4_Click(object sender, EventArgs e) { ckbState[ckbIndex[3]] = checkBoxImage4.Checked; } + private void checkBoxImage5_Click(object sender, EventArgs e) { ckbState[ckbIndex[4]] = checkBoxImage5.Checked; } + private void checkBoxImage6_Click(object sender, EventArgs e) { ckbState[ckbIndex[5]] = checkBoxImage6.Checked; } + private void checkBoxImage7_Click(object sender, EventArgs e) { ckbState[ckbIndex[6]] = checkBoxImage7.Checked; } + private void checkBoxImage8_Click(object sender, EventArgs e) { ckbState[ckbIndex[7]] = checkBoxImage8.Checked; } + private void checkBoxImage9_Click(object sender, EventArgs e) { ckbState[ckbIndex[8]] = checkBoxImage9.Checked; } + private void checkBoxImage10_Click(object sender, EventArgs e) { ckbState[ckbIndex[9]] = checkBoxImage10.Checked; } + private void checkBoxImage11_Click(object sender, EventArgs e) { ckbState[ckbIndex[10]] = checkBoxImage11.Checked; } + private void checkBoxImage12_Click(object sender, EventArgs e) { ckbState[ckbIndex[11]] = checkBoxImage12.Checked; } + private void checkBoxImage13_Click(object sender, EventArgs e) { ckbState[ckbIndex[12]] = checkBoxImage13.Checked; } + private void checkBoxImage14_Click(object sender, EventArgs e) { ckbState[ckbIndex[13]] = checkBoxImage14.Checked; } + private void checkBoxImage15_Click(object sender, EventArgs e) { ckbState[ckbIndex[14]] = checkBoxImage15.Checked; } + private void checkBoxImage16_Click(object sender, EventArgs e) { ckbState[ckbIndex[15]] = checkBoxImage16.Checked; } + private void checkBoxImage17_Click(object sender, EventArgs e) { ckbState[ckbIndex[16]] = checkBoxImage17.Checked; } + private void checkBoxImage18_Click(object sender, EventArgs e) { ckbState[ckbIndex[17]] = checkBoxImage18.Checked; } + private void checkBoxImage19_Click(object sender, EventArgs e) { ckbState[ckbIndex[18]] = checkBoxImage19.Checked; } + private void checkBoxImage20_Click(object sender, EventArgs e) { ckbState[ckbIndex[19]] = checkBoxImage20.Checked; } + private void checkBoxImage21_Click(object sender, EventArgs e) { ckbState[ckbIndex[20]] = checkBoxImage21.Checked; } + private void checkBoxImage22_Click(object sender, EventArgs e) { ckbState[ckbIndex[21]] = checkBoxImage22.Checked; } + private void checkBoxImage23_Click(object sender, EventArgs e) { ckbState[ckbIndex[22]] = checkBoxImage23.Checked; } + private void checkBoxImage24_Click(object sender, EventArgs e) { ckbState[ckbIndex[23]] = checkBoxImage24.Checked; } + private void checkBoxImage25_Click(object sender, EventArgs e) { ckbState[ckbIndex[24]] = checkBoxImage25.Checked; } + private void checkBoxImage26_Click(object sender, EventArgs e) { ckbState[ckbIndex[25]] = checkBoxImage26.Checked; } + private void checkBoxImage27_Click(object sender, EventArgs e) { ckbState[ckbIndex[26]] = checkBoxImage27.Checked; } + private void checkBoxImage28_Click(object sender, EventArgs e) { ckbState[ckbIndex[27]] = checkBoxImage28.Checked; } + private void checkBoxImage29_Click(object sender, EventArgs e) { ckbState[ckbIndex[28]] = checkBoxImage29.Checked; } + private void checkBoxImage30_Click(object sender, EventArgs e) { ckbState[ckbIndex[29]] = checkBoxImage30.Checked; } + private void checkBoxImage31_Click(object sender, EventArgs e) { ckbState[ckbIndex[30]] = checkBoxImage31.Checked; } + private void checkBoxImage32_Click(object sender, EventArgs e) { ckbState[ckbIndex[31]] = checkBoxImage32.Checked; } + private void checkBoxImage33_Click(object sender, EventArgs e) { ckbState[ckbIndex[32]] = checkBoxImage33.Checked; } + private void checkBoxImage34_Click(object sender, EventArgs e) { ckbState[ckbIndex[33]] = checkBoxImage34.Checked; } + private void checkBoxImage35_Click(object sender, EventArgs e) { ckbState[ckbIndex[34]] = checkBoxImage35.Checked; } + private void checkBoxImage36_Click(object sender, EventArgs e) { ckbState[ckbIndex[35]] = checkBoxImage36.Checked; } + private void checkBoxImage37_Click(object sender, EventArgs e) { ckbState[ckbIndex[36]] = checkBoxImage37.Checked; } + private void checkBoxImage38_Click(object sender, EventArgs e) { ckbState[ckbIndex[37]] = checkBoxImage38.Checked; } + private void checkBoxImage39_Click(object sender, EventArgs e) { ckbState[ckbIndex[38]] = checkBoxImage39.Checked; } + private void checkBoxImage40_Click(object sender, EventArgs e) { ckbState[ckbIndex[39]] = checkBoxImage40.Checked; } + private void checkBoxImage41_Click(object sender, EventArgs e) { ckbState[ckbIndex[40]] = checkBoxImage41.Checked; } + private void checkBoxImage42_Click(object sender, EventArgs e) { ckbState[ckbIndex[41]] = checkBoxImage42.Checked; } + private void checkBoxImage43_Click(object sender, EventArgs e) { ckbState[ckbIndex[42]] = checkBoxImage43.Checked; } + private void checkBoxImage44_Click(object sender, EventArgs e) { ckbState[ckbIndex[43]] = checkBoxImage44.Checked; } + private void checkBoxImage45_Click(object sender, EventArgs e) { ckbState[ckbIndex[44]] = checkBoxImage45.Checked; } + private void checkBoxImage46_Click(object sender, EventArgs e) { ckbState[ckbIndex[45]] = checkBoxImage46.Checked; } + private void checkBoxImage47_Click(object sender, EventArgs e) { ckbState[ckbIndex[46]] = checkBoxImage47.Checked; } + private void checkBoxImage48_Click(object sender, EventArgs e) { ckbState[ckbIndex[47]] = checkBoxImage48.Checked; } + + /// + /// Get states of checkboxes as one bitfield (long) + /// + /// Long bitfield + private long GetCheckBoxStates() + { + long result = 0; + for (int i = 0; i < 48; i++) + { + int wmNr0 = ckbIndex[i]; + if (wmNr0 >= 0 && ckbState[wmNr0]) + { + result += (1L << wmNr0); + } + } + return result; + } + + /// + /// Set checkboxes to states stored in a bitfield (long) + /// + private void SetCheckBoxStates(long state) + { + CheckBoxImage[] chkBoxes = new CheckBoxImage[48] + { + checkBoxImage1, checkBoxImage2, checkBoxImage3, checkBoxImage4, checkBoxImage5, + checkBoxImage6, checkBoxImage7, checkBoxImage8, checkBoxImage9, checkBoxImage10, + checkBoxImage11, checkBoxImage12, checkBoxImage13, checkBoxImage14, checkBoxImage15, + checkBoxImage16, checkBoxImage17, checkBoxImage18, checkBoxImage19, checkBoxImage20, + checkBoxImage21, checkBoxImage22, checkBoxImage23, checkBoxImage24, checkBoxImage25, + checkBoxImage26, checkBoxImage27, checkBoxImage28, checkBoxImage29, checkBoxImage30, + checkBoxImage31, checkBoxImage32, checkBoxImage33, checkBoxImage34, checkBoxImage35, + checkBoxImage36, checkBoxImage37, checkBoxImage38, checkBoxImage39, checkBoxImage40, + checkBoxImage41, checkBoxImage42, checkBoxImage43, checkBoxImage44, checkBoxImage45, + checkBoxImage46, checkBoxImage47, checkBoxImage48, + }; + for (int i = 0; i < 48; i++) + { + int wmNr0 = ckbIndex[i]; + if (wmNr0 >= 0) + { + chkBoxes[i].Checked = ckbState[wmNr0] = ((state & (1L << wmNr0)) != 0); + } + } + } + + private void saveButton_Click(object sender, EventArgs e) + { + Program.LocalSettings.OptoHeadsEnabled = GetCheckBoxStates(); + Program.LocalSettings.Save(); + DialogResult = DialogResult.OK; + Close(); + } + + #endregion + + private void GenesisCommunicationForm_FormClosing(object sender, FormClosingEventArgs e) + { + if (!forcedClose && !formCompleted && !checkBoxesEditMode) + { + e.Cancel = true; + } + } + } +} diff --git a/TBF/Rig/TestMethods/GenesisCommunication/GenesisCommunicationForm.designer.cs b/TBF/Rig/TestMethods/GenesisCommunication/GenesisCommunicationForm.designer.cs new file mode 100644 index 000000000..2c684cbfe --- /dev/null +++ b/TBF/Rig/TestMethods/GenesisCommunication/GenesisCommunicationForm.designer.cs @@ -0,0 +1,2903 @@ +using TBF.Rig.TestMethods.iPerlCommunication; +/// +/// Copyright (c) 2015 Sensus Metering Systems +/// Author: Milan Hanajík +/// +namespace TBF.Rig.TestMethods.GenesisCommunication +{ + partial class GenesisCommunicationForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GenesisCommunicationForm)); + this.wmTextBox2 = new System.Windows.Forms.TextBox(); + this.wmLabel2 = new System.Windows.Forms.Label(); + this.wmLabel1 = new System.Windows.Forms.Label(); + this.wmTextBox3 = new System.Windows.Forms.TextBox(); + this.wmLabel3 = new System.Windows.Forms.Label(); + this.wmTextBox4 = new System.Windows.Forms.TextBox(); + this.wmLabel4 = new System.Windows.Forms.Label(); + this.wmTextBox5 = new System.Windows.Forms.TextBox(); + this.wmLabel5 = new System.Windows.Forms.Label(); + this.wmTextBox6 = new System.Windows.Forms.TextBox(); + this.wmLabel6 = new System.Windows.Forms.Label(); + this.wmTextBox1 = new System.Windows.Forms.TextBox(); + this.wmTextBox7 = new System.Windows.Forms.TextBox(); + this.wmLabel7 = new System.Windows.Forms.Label(); + this.wmTextBox8 = new System.Windows.Forms.TextBox(); + this.wmLabel8 = new System.Windows.Forms.Label(); + this.wmTextBox9 = new System.Windows.Forms.TextBox(); + this.wmLabel9 = new System.Windows.Forms.Label(); + this.wmTextBox10 = new System.Windows.Forms.TextBox(); + this.wmLabel10 = new System.Windows.Forms.Label(); + this.wmTextBox12 = new System.Windows.Forms.TextBox(); + this.wmLabel12 = new System.Windows.Forms.Label(); + this.wmTextBox11 = new System.Windows.Forms.TextBox(); + this.wmLabel11 = new System.Windows.Forms.Label(); + this.wmTextBox24 = new System.Windows.Forms.TextBox(); + this.wmLabel24 = new System.Windows.Forms.Label(); + this.wmTextBox23 = new System.Windows.Forms.TextBox(); + this.wmLabel23 = new System.Windows.Forms.Label(); + this.wmTextBox22 = new System.Windows.Forms.TextBox(); + this.wmLabel22 = new System.Windows.Forms.Label(); + this.wmTextBox21 = new System.Windows.Forms.TextBox(); + this.wmLabel21 = new System.Windows.Forms.Label(); + this.wmTextBox20 = new System.Windows.Forms.TextBox(); + this.wmLabel20 = new System.Windows.Forms.Label(); + this.wmTextBox19 = new System.Windows.Forms.TextBox(); + this.wmLabel19 = new System.Windows.Forms.Label(); + this.wmTextBox18 = new System.Windows.Forms.TextBox(); + this.wmLabel18 = new System.Windows.Forms.Label(); + this.wmTextBox17 = new System.Windows.Forms.TextBox(); + this.wmLabel17 = new System.Windows.Forms.Label(); + this.wmTextBox16 = new System.Windows.Forms.TextBox(); + this.wmLabel16 = new System.Windows.Forms.Label(); + this.wmTextBox15 = new System.Windows.Forms.TextBox(); + this.wmLabel15 = new System.Windows.Forms.Label(); + this.wmTextBox14 = new System.Windows.Forms.TextBox(); + this.wmLabel14 = new System.Windows.Forms.Label(); + this.wmTextBox13 = new System.Windows.Forms.TextBox(); + this.wmLabel13 = new System.Windows.Forms.Label(); + this.wmTextBox48 = new System.Windows.Forms.TextBox(); + this.wmLabel48 = new System.Windows.Forms.Label(); + this.wmTextBox47 = new System.Windows.Forms.TextBox(); + this.wmLabel47 = new System.Windows.Forms.Label(); + this.wmTextBox46 = new System.Windows.Forms.TextBox(); + this.wmLabel46 = new System.Windows.Forms.Label(); + this.wmTextBox45 = new System.Windows.Forms.TextBox(); + this.wmLabel45 = new System.Windows.Forms.Label(); + this.wmTextBox44 = new System.Windows.Forms.TextBox(); + this.wmLabel44 = new System.Windows.Forms.Label(); + this.wmTextBox43 = new System.Windows.Forms.TextBox(); + this.wmLabel43 = new System.Windows.Forms.Label(); + this.wmTextBox42 = new System.Windows.Forms.TextBox(); + this.wmLabel42 = new System.Windows.Forms.Label(); + this.wmTextBox41 = new System.Windows.Forms.TextBox(); + this.wmLabel41 = new System.Windows.Forms.Label(); + this.wmTextBox40 = new System.Windows.Forms.TextBox(); + this.wmLabel40 = new System.Windows.Forms.Label(); + this.wmTextBox39 = new System.Windows.Forms.TextBox(); + this.wmLabel39 = new System.Windows.Forms.Label(); + this.wmTextBox38 = new System.Windows.Forms.TextBox(); + this.wmLabel38 = new System.Windows.Forms.Label(); + this.wmTextBox37 = new System.Windows.Forms.TextBox(); + this.wmLabel37 = new System.Windows.Forms.Label(); + this.wmTextBox36 = new System.Windows.Forms.TextBox(); + this.wmLabel36 = new System.Windows.Forms.Label(); + this.wmTextBox35 = new System.Windows.Forms.TextBox(); + this.wmLabel35 = new System.Windows.Forms.Label(); + this.wmTextBox34 = new System.Windows.Forms.TextBox(); + this.wmLabel34 = new System.Windows.Forms.Label(); + this.wmTextBox33 = new System.Windows.Forms.TextBox(); + this.wmLabel33 = new System.Windows.Forms.Label(); + this.wmTextBox32 = new System.Windows.Forms.TextBox(); + this.wmLabel32 = new System.Windows.Forms.Label(); + this.wmTextBox31 = new System.Windows.Forms.TextBox(); + this.wmLabel31 = new System.Windows.Forms.Label(); + this.wmTextBox30 = new System.Windows.Forms.TextBox(); + this.wmLabel30 = new System.Windows.Forms.Label(); + this.wmTextBox29 = new System.Windows.Forms.TextBox(); + this.wmLabel29 = new System.Windows.Forms.Label(); + this.wmTextBox28 = new System.Windows.Forms.TextBox(); + this.wmLabel28 = new System.Windows.Forms.Label(); + this.wmTextBox27 = new System.Windows.Forms.TextBox(); + this.wmLabel27 = new System.Windows.Forms.Label(); + this.wmTextBox26 = new System.Windows.Forms.TextBox(); + this.wmLabel26 = new System.Windows.Forms.Label(); + this.wmTextBox25 = new System.Windows.Forms.TextBox(); + this.wmLabel25 = new System.Windows.Forms.Label(); + this.activityLabel = new System.Windows.Forms.Label(); + this.pictureBox48 = new System.Windows.Forms.PictureBox(); + this.pictureBox47 = new System.Windows.Forms.PictureBox(); + this.pictureBox46 = new System.Windows.Forms.PictureBox(); + this.pictureBox45 = new System.Windows.Forms.PictureBox(); + this.pictureBox44 = new System.Windows.Forms.PictureBox(); + this.pictureBox43 = new System.Windows.Forms.PictureBox(); + this.pictureBox42 = new System.Windows.Forms.PictureBox(); + this.pictureBox41 = new System.Windows.Forms.PictureBox(); + this.pictureBox40 = new System.Windows.Forms.PictureBox(); + this.pictureBox39 = new System.Windows.Forms.PictureBox(); + this.pictureBox38 = new System.Windows.Forms.PictureBox(); + this.pictureBox37 = new System.Windows.Forms.PictureBox(); + this.pictureBox36 = new System.Windows.Forms.PictureBox(); + this.pictureBox35 = new System.Windows.Forms.PictureBox(); + this.pictureBox34 = new System.Windows.Forms.PictureBox(); + this.pictureBox33 = new System.Windows.Forms.PictureBox(); + this.pictureBox32 = new System.Windows.Forms.PictureBox(); + this.pictureBox31 = new System.Windows.Forms.PictureBox(); + this.pictureBox30 = new System.Windows.Forms.PictureBox(); + this.pictureBox29 = new System.Windows.Forms.PictureBox(); + this.pictureBox28 = new System.Windows.Forms.PictureBox(); + this.pictureBox27 = new System.Windows.Forms.PictureBox(); + this.pictureBox26 = new System.Windows.Forms.PictureBox(); + this.pictureBox25 = new System.Windows.Forms.PictureBox(); + this.pictureBox24 = new System.Windows.Forms.PictureBox(); + this.pictureBox23 = new System.Windows.Forms.PictureBox(); + this.pictureBox22 = new System.Windows.Forms.PictureBox(); + this.pictureBox21 = new System.Windows.Forms.PictureBox(); + this.pictureBox20 = new System.Windows.Forms.PictureBox(); + this.pictureBox19 = new System.Windows.Forms.PictureBox(); + this.pictureBox18 = new System.Windows.Forms.PictureBox(); + this.pictureBox17 = new System.Windows.Forms.PictureBox(); + this.pictureBox16 = new System.Windows.Forms.PictureBox(); + this.pictureBox15 = new System.Windows.Forms.PictureBox(); + this.pictureBox14 = new System.Windows.Forms.PictureBox(); + this.pictureBox13 = new System.Windows.Forms.PictureBox(); + this.pictureBox12 = new System.Windows.Forms.PictureBox(); + this.pictureBox11 = new System.Windows.Forms.PictureBox(); + this.pictureBox10 = new System.Windows.Forms.PictureBox(); + this.pictureBox9 = new System.Windows.Forms.PictureBox(); + this.pictureBox8 = new System.Windows.Forms.PictureBox(); + this.pictureBox7 = new System.Windows.Forms.PictureBox(); + this.pictureBox6 = new System.Windows.Forms.PictureBox(); + this.pictureBox5 = new System.Windows.Forms.PictureBox(); + this.pictureBox4 = new System.Windows.Forms.PictureBox(); + this.pictureBox3 = new System.Windows.Forms.PictureBox(); + this.pictureBox2 = new System.Windows.Forms.PictureBox(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.saveButton = new System.Windows.Forms.Button(); + this.samplePictureBox1 = new System.Windows.Forms.PictureBox(); + this.samplePictureBox2 = new System.Windows.Forms.PictureBox(); + this.samplePictureBox3 = new System.Windows.Forms.PictureBox(); + this.sampleLabel1 = new System.Windows.Forms.Label(); + this.sampleLabel2 = new System.Windows.Forms.Label(); + this.sampleLabel3 = new System.Windows.Forms.Label(); + this.checkBoxImage48 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage47 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage46 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage45 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage44 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage43 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage42 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage41 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage40 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage39 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage38 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage37 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage36 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage35 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage34 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage33 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage32 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage31 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage30 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage29 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage28 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage27 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage26 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage25 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage24 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage23 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage22 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage21 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage20 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage19 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage18 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage17 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage16 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage15 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage14 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage13 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage12 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage11 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage10 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage9 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage8 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage7 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage6 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage5 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage4 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage3 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage2 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + this.checkBoxImage1 = new TBF.Rig.TestMethods.iPerlCommunication.CheckBoxImage(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox48)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox47)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox46)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox45)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox44)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox43)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox42)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox41)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox40)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox39)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox38)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox37)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox36)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox35)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox34)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox33)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox32)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox31)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox30)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox29)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox28)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox27)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox26)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox25)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox24)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox23)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox22)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox21)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox20)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox19)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox18)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox17)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox16)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox15)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox14)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox13)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox12)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox11)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox10)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox9)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox8)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox7)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox6)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox5)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.samplePictureBox1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.samplePictureBox2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.samplePictureBox3)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage48)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage47)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage46)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage45)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage44)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage43)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage42)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage41)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage40)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage39)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage38)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage37)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage36)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage35)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage34)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage33)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage32)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage31)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage30)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage29)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage28)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage27)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage26)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage25)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage24)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage23)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage22)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage21)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage20)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage19)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage18)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage17)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage16)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage15)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage14)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage13)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage12)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage11)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage10)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage9)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage8)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage7)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage6)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage5)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage4)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage3)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage1)).BeginInit(); + this.SuspendLayout(); + // + // wmTextBox2 + // + this.wmTextBox2.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox2.Location = new System.Drawing.Point(160, 118); + this.wmTextBox2.Name = "wmTextBox2"; + this.wmTextBox2.Size = new System.Drawing.Size(380, 23); + this.wmTextBox2.TabIndex = 1; + this.wmTextBox2.Visible = false; + // + // wmLabel2 + // + this.wmLabel2.AutoSize = true; + this.wmLabel2.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel2.Location = new System.Drawing.Point(35, 124); + this.wmLabel2.Name = "wmLabel2"; + this.wmLabel2.Size = new System.Drawing.Size(16, 16); + this.wmLabel2.TabIndex = 0; + this.wmLabel2.Text = "2"; + this.wmLabel2.Visible = false; + // + // wmLabel1 + // + this.wmLabel1.AutoSize = true; + this.wmLabel1.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel1.Location = new System.Drawing.Point(35, 95); + this.wmLabel1.Name = "wmLabel1"; + this.wmLabel1.Size = new System.Drawing.Size(16, 16); + this.wmLabel1.TabIndex = 0; + this.wmLabel1.Text = "1"; + this.wmLabel1.Visible = false; + // + // wmTextBox3 + // + this.wmTextBox3.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox3.Location = new System.Drawing.Point(160, 147); + this.wmTextBox3.Name = "wmTextBox3"; + this.wmTextBox3.Size = new System.Drawing.Size(380, 23); + this.wmTextBox3.TabIndex = 1; + this.wmTextBox3.Visible = false; + // + // wmLabel3 + // + this.wmLabel3.AutoSize = true; + this.wmLabel3.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel3.Location = new System.Drawing.Point(35, 153); + this.wmLabel3.Name = "wmLabel3"; + this.wmLabel3.Size = new System.Drawing.Size(16, 16); + this.wmLabel3.TabIndex = 0; + this.wmLabel3.Text = "3"; + this.wmLabel3.Visible = false; + // + // wmTextBox4 + // + this.wmTextBox4.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox4.Location = new System.Drawing.Point(160, 176); + this.wmTextBox4.Name = "wmTextBox4"; + this.wmTextBox4.Size = new System.Drawing.Size(380, 23); + this.wmTextBox4.TabIndex = 1; + this.wmTextBox4.Visible = false; + // + // wmLabel4 + // + this.wmLabel4.AutoSize = true; + this.wmLabel4.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel4.Location = new System.Drawing.Point(35, 182); + this.wmLabel4.Name = "wmLabel4"; + this.wmLabel4.Size = new System.Drawing.Size(16, 16); + this.wmLabel4.TabIndex = 0; + this.wmLabel4.Text = "4"; + this.wmLabel4.Visible = false; + // + // wmTextBox5 + // + this.wmTextBox5.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox5.Location = new System.Drawing.Point(160, 205); + this.wmTextBox5.Name = "wmTextBox5"; + this.wmTextBox5.Size = new System.Drawing.Size(380, 23); + this.wmTextBox5.TabIndex = 1; + this.wmTextBox5.Visible = false; + // + // wmLabel5 + // + this.wmLabel5.AutoSize = true; + this.wmLabel5.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel5.Location = new System.Drawing.Point(35, 211); + this.wmLabel5.Name = "wmLabel5"; + this.wmLabel5.Size = new System.Drawing.Size(16, 16); + this.wmLabel5.TabIndex = 0; + this.wmLabel5.Text = "5"; + this.wmLabel5.Visible = false; + // + // wmTextBox6 + // + this.wmTextBox6.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox6.Location = new System.Drawing.Point(160, 234); + this.wmTextBox6.Name = "wmTextBox6"; + this.wmTextBox6.Size = new System.Drawing.Size(380, 23); + this.wmTextBox6.TabIndex = 1; + this.wmTextBox6.Visible = false; + // + // wmLabel6 + // + this.wmLabel6.AutoSize = true; + this.wmLabel6.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel6.Location = new System.Drawing.Point(35, 241); + this.wmLabel6.Name = "wmLabel6"; + this.wmLabel6.Size = new System.Drawing.Size(16, 16); + this.wmLabel6.TabIndex = 0; + this.wmLabel6.Text = "6"; + this.wmLabel6.Visible = false; + // + // wmTextBox1 + // + this.wmTextBox1.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox1.Location = new System.Drawing.Point(160, 89); + this.wmTextBox1.Name = "wmTextBox1"; + this.wmTextBox1.Size = new System.Drawing.Size(380, 23); + this.wmTextBox1.TabIndex = 1; + this.wmTextBox1.Visible = false; + // + // wmTextBox7 + // + this.wmTextBox7.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox7.Location = new System.Drawing.Point(160, 263); + this.wmTextBox7.Name = "wmTextBox7"; + this.wmTextBox7.Size = new System.Drawing.Size(380, 23); + this.wmTextBox7.TabIndex = 9; + this.wmTextBox7.Visible = false; + // + // wmLabel7 + // + this.wmLabel7.AutoSize = true; + this.wmLabel7.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel7.Location = new System.Drawing.Point(35, 270); + this.wmLabel7.Name = "wmLabel7"; + this.wmLabel7.Size = new System.Drawing.Size(16, 16); + this.wmLabel7.TabIndex = 8; + this.wmLabel7.Text = "7"; + this.wmLabel7.Visible = false; + // + // wmTextBox8 + // + this.wmTextBox8.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox8.Location = new System.Drawing.Point(160, 292); + this.wmTextBox8.Name = "wmTextBox8"; + this.wmTextBox8.Size = new System.Drawing.Size(380, 23); + this.wmTextBox8.TabIndex = 11; + this.wmTextBox8.Visible = false; + // + // wmLabel8 + // + this.wmLabel8.AutoSize = true; + this.wmLabel8.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel8.Location = new System.Drawing.Point(35, 299); + this.wmLabel8.Name = "wmLabel8"; + this.wmLabel8.Size = new System.Drawing.Size(16, 16); + this.wmLabel8.TabIndex = 10; + this.wmLabel8.Text = "8"; + this.wmLabel8.Visible = false; + // + // wmTextBox9 + // + this.wmTextBox9.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox9.Location = new System.Drawing.Point(160, 321); + this.wmTextBox9.Name = "wmTextBox9"; + this.wmTextBox9.Size = new System.Drawing.Size(380, 23); + this.wmTextBox9.TabIndex = 13; + this.wmTextBox9.Visible = false; + // + // wmLabel9 + // + this.wmLabel9.AutoSize = true; + this.wmLabel9.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel9.Location = new System.Drawing.Point(35, 327); + this.wmLabel9.Name = "wmLabel9"; + this.wmLabel9.Size = new System.Drawing.Size(16, 16); + this.wmLabel9.TabIndex = 12; + this.wmLabel9.Text = "9"; + this.wmLabel9.Visible = false; + // + // wmTextBox10 + // + this.wmTextBox10.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox10.Location = new System.Drawing.Point(160, 350); + this.wmTextBox10.Name = "wmTextBox10"; + this.wmTextBox10.Size = new System.Drawing.Size(380, 23); + this.wmTextBox10.TabIndex = 15; + this.wmTextBox10.Visible = false; + // + // wmLabel10 + // + this.wmLabel10.AutoSize = true; + this.wmLabel10.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel10.Location = new System.Drawing.Point(35, 356); + this.wmLabel10.Name = "wmLabel10"; + this.wmLabel10.Size = new System.Drawing.Size(24, 16); + this.wmLabel10.TabIndex = 14; + this.wmLabel10.Text = "10"; + this.wmLabel10.Visible = false; + // + // wmTextBox12 + // + this.wmTextBox12.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox12.Location = new System.Drawing.Point(160, 408); + this.wmTextBox12.Name = "wmTextBox12"; + this.wmTextBox12.Size = new System.Drawing.Size(380, 23); + this.wmTextBox12.TabIndex = 19; + this.wmTextBox12.Visible = false; + // + // wmLabel12 + // + this.wmLabel12.AutoSize = true; + this.wmLabel12.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel12.Location = new System.Drawing.Point(35, 414); + this.wmLabel12.Name = "wmLabel12"; + this.wmLabel12.Size = new System.Drawing.Size(24, 16); + this.wmLabel12.TabIndex = 18; + this.wmLabel12.Text = "12"; + this.wmLabel12.Visible = false; + // + // wmTextBox11 + // + this.wmTextBox11.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox11.Location = new System.Drawing.Point(160, 379); + this.wmTextBox11.Name = "wmTextBox11"; + this.wmTextBox11.Size = new System.Drawing.Size(380, 23); + this.wmTextBox11.TabIndex = 17; + this.wmTextBox11.Visible = false; + // + // wmLabel11 + // + this.wmLabel11.AutoSize = true; + this.wmLabel11.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel11.Location = new System.Drawing.Point(35, 385); + this.wmLabel11.Name = "wmLabel11"; + this.wmLabel11.Size = new System.Drawing.Size(24, 16); + this.wmLabel11.TabIndex = 16; + this.wmLabel11.Text = "11"; + this.wmLabel11.Visible = false; + // + // wmTextBox24 + // + this.wmTextBox24.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox24.Location = new System.Drawing.Point(160, 756); + this.wmTextBox24.Name = "wmTextBox24"; + this.wmTextBox24.Size = new System.Drawing.Size(380, 23); + this.wmTextBox24.TabIndex = 43; + this.wmTextBox24.Visible = false; + // + // wmLabel24 + // + this.wmLabel24.AutoSize = true; + this.wmLabel24.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel24.Location = new System.Drawing.Point(35, 762); + this.wmLabel24.Name = "wmLabel24"; + this.wmLabel24.Size = new System.Drawing.Size(24, 16); + this.wmLabel24.TabIndex = 42; + this.wmLabel24.Text = "24"; + this.wmLabel24.Visible = false; + // + // wmTextBox23 + // + this.wmTextBox23.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox23.Location = new System.Drawing.Point(160, 727); + this.wmTextBox23.Name = "wmTextBox23"; + this.wmTextBox23.Size = new System.Drawing.Size(380, 23); + this.wmTextBox23.TabIndex = 41; + this.wmTextBox23.Visible = false; + // + // wmLabel23 + // + this.wmLabel23.AutoSize = true; + this.wmLabel23.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel23.Location = new System.Drawing.Point(35, 733); + this.wmLabel23.Name = "wmLabel23"; + this.wmLabel23.Size = new System.Drawing.Size(24, 16); + this.wmLabel23.TabIndex = 40; + this.wmLabel23.Text = "23"; + this.wmLabel23.Visible = false; + // + // wmTextBox22 + // + this.wmTextBox22.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox22.Location = new System.Drawing.Point(160, 698); + this.wmTextBox22.Name = "wmTextBox22"; + this.wmTextBox22.Size = new System.Drawing.Size(380, 23); + this.wmTextBox22.TabIndex = 39; + this.wmTextBox22.Visible = false; + // + // wmLabel22 + // + this.wmLabel22.AutoSize = true; + this.wmLabel22.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel22.Location = new System.Drawing.Point(35, 704); + this.wmLabel22.Name = "wmLabel22"; + this.wmLabel22.Size = new System.Drawing.Size(24, 16); + this.wmLabel22.TabIndex = 38; + this.wmLabel22.Text = "22"; + this.wmLabel22.Visible = false; + // + // wmTextBox21 + // + this.wmTextBox21.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox21.Location = new System.Drawing.Point(160, 669); + this.wmTextBox21.Name = "wmTextBox21"; + this.wmTextBox21.Size = new System.Drawing.Size(380, 23); + this.wmTextBox21.TabIndex = 37; + this.wmTextBox21.Visible = false; + // + // wmLabel21 + // + this.wmLabel21.AutoSize = true; + this.wmLabel21.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel21.Location = new System.Drawing.Point(35, 675); + this.wmLabel21.Name = "wmLabel21"; + this.wmLabel21.Size = new System.Drawing.Size(24, 16); + this.wmLabel21.TabIndex = 36; + this.wmLabel21.Text = "21"; + this.wmLabel21.Visible = false; + // + // wmTextBox20 + // + this.wmTextBox20.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox20.Location = new System.Drawing.Point(160, 640); + this.wmTextBox20.Name = "wmTextBox20"; + this.wmTextBox20.Size = new System.Drawing.Size(380, 23); + this.wmTextBox20.TabIndex = 35; + this.wmTextBox20.Visible = false; + // + // wmLabel20 + // + this.wmLabel20.AutoSize = true; + this.wmLabel20.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel20.Location = new System.Drawing.Point(35, 647); + this.wmLabel20.Name = "wmLabel20"; + this.wmLabel20.Size = new System.Drawing.Size(24, 16); + this.wmLabel20.TabIndex = 34; + this.wmLabel20.Text = "20"; + this.wmLabel20.Visible = false; + // + // wmTextBox19 + // + this.wmTextBox19.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox19.Location = new System.Drawing.Point(160, 611); + this.wmTextBox19.Name = "wmTextBox19"; + this.wmTextBox19.Size = new System.Drawing.Size(380, 23); + this.wmTextBox19.TabIndex = 33; + this.wmTextBox19.Visible = false; + // + // wmLabel19 + // + this.wmLabel19.AutoSize = true; + this.wmLabel19.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel19.Location = new System.Drawing.Point(35, 618); + this.wmLabel19.Name = "wmLabel19"; + this.wmLabel19.Size = new System.Drawing.Size(24, 16); + this.wmLabel19.TabIndex = 32; + this.wmLabel19.Text = "19"; + this.wmLabel19.Visible = false; + // + // wmTextBox18 + // + this.wmTextBox18.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox18.Location = new System.Drawing.Point(160, 582); + this.wmTextBox18.Name = "wmTextBox18"; + this.wmTextBox18.Size = new System.Drawing.Size(380, 23); + this.wmTextBox18.TabIndex = 27; + this.wmTextBox18.Visible = false; + // + // wmLabel18 + // + this.wmLabel18.AutoSize = true; + this.wmLabel18.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel18.Location = new System.Drawing.Point(35, 589); + this.wmLabel18.Name = "wmLabel18"; + this.wmLabel18.Size = new System.Drawing.Size(24, 16); + this.wmLabel18.TabIndex = 23; + this.wmLabel18.Text = "18"; + this.wmLabel18.Visible = false; + // + // wmTextBox17 + // + this.wmTextBox17.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox17.Location = new System.Drawing.Point(160, 553); + this.wmTextBox17.Name = "wmTextBox17"; + this.wmTextBox17.Size = new System.Drawing.Size(380, 23); + this.wmTextBox17.TabIndex = 26; + this.wmTextBox17.Visible = false; + // + // wmLabel17 + // + this.wmLabel17.AutoSize = true; + this.wmLabel17.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel17.Location = new System.Drawing.Point(35, 559); + this.wmLabel17.Name = "wmLabel17"; + this.wmLabel17.Size = new System.Drawing.Size(24, 16); + this.wmLabel17.TabIndex = 22; + this.wmLabel17.Text = "17"; + this.wmLabel17.Visible = false; + // + // wmTextBox16 + // + this.wmTextBox16.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox16.Location = new System.Drawing.Point(160, 524); + this.wmTextBox16.Name = "wmTextBox16"; + this.wmTextBox16.Size = new System.Drawing.Size(380, 23); + this.wmTextBox16.TabIndex = 30; + this.wmTextBox16.Visible = false; + // + // wmLabel16 + // + this.wmLabel16.AutoSize = true; + this.wmLabel16.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel16.Location = new System.Drawing.Point(35, 530); + this.wmLabel16.Name = "wmLabel16"; + this.wmLabel16.Size = new System.Drawing.Size(24, 16); + this.wmLabel16.TabIndex = 21; + this.wmLabel16.Text = "16"; + this.wmLabel16.Visible = false; + // + // wmTextBox15 + // + this.wmTextBox15.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox15.Location = new System.Drawing.Point(160, 495); + this.wmTextBox15.Name = "wmTextBox15"; + this.wmTextBox15.Size = new System.Drawing.Size(380, 23); + this.wmTextBox15.TabIndex = 31; + this.wmTextBox15.Visible = false; + // + // wmLabel15 + // + this.wmLabel15.AutoSize = true; + this.wmLabel15.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel15.Location = new System.Drawing.Point(35, 501); + this.wmLabel15.Name = "wmLabel15"; + this.wmLabel15.Size = new System.Drawing.Size(24, 16); + this.wmLabel15.TabIndex = 20; + this.wmLabel15.Text = "15"; + this.wmLabel15.Visible = false; + // + // wmTextBox14 + // + this.wmTextBox14.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox14.Location = new System.Drawing.Point(160, 466); + this.wmTextBox14.Name = "wmTextBox14"; + this.wmTextBox14.Size = new System.Drawing.Size(380, 23); + this.wmTextBox14.TabIndex = 28; + this.wmTextBox14.Visible = false; + // + // wmLabel14 + // + this.wmLabel14.AutoSize = true; + this.wmLabel14.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel14.Location = new System.Drawing.Point(35, 472); + this.wmLabel14.Name = "wmLabel14"; + this.wmLabel14.Size = new System.Drawing.Size(24, 16); + this.wmLabel14.TabIndex = 25; + this.wmLabel14.Text = "14"; + this.wmLabel14.Visible = false; + // + // wmTextBox13 + // + this.wmTextBox13.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox13.Location = new System.Drawing.Point(160, 437); + this.wmTextBox13.Name = "wmTextBox13"; + this.wmTextBox13.Size = new System.Drawing.Size(380, 23); + this.wmTextBox13.TabIndex = 29; + this.wmTextBox13.Visible = false; + // + // wmLabel13 + // + this.wmLabel13.AutoSize = true; + this.wmLabel13.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel13.Location = new System.Drawing.Point(35, 443); + this.wmLabel13.Name = "wmLabel13"; + this.wmLabel13.Size = new System.Drawing.Size(24, 16); + this.wmLabel13.TabIndex = 24; + this.wmLabel13.Text = "13"; + this.wmLabel13.Visible = false; + // + // wmTextBox48 + // + this.wmTextBox48.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox48.Location = new System.Drawing.Point(720, 756); + this.wmTextBox48.Name = "wmTextBox48"; + this.wmTextBox48.Size = new System.Drawing.Size(380, 23); + this.wmTextBox48.TabIndex = 94; + this.wmTextBox48.Visible = false; + // + // wmLabel48 + // + this.wmLabel48.AutoSize = true; + this.wmLabel48.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel48.Location = new System.Drawing.Point(595, 762); + this.wmLabel48.Name = "wmLabel48"; + this.wmLabel48.Size = new System.Drawing.Size(24, 16); + this.wmLabel48.TabIndex = 93; + this.wmLabel48.Text = "48"; + this.wmLabel48.Visible = false; + // + // wmTextBox47 + // + this.wmTextBox47.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox47.Location = new System.Drawing.Point(720, 727); + this.wmTextBox47.Name = "wmTextBox47"; + this.wmTextBox47.Size = new System.Drawing.Size(380, 23); + this.wmTextBox47.TabIndex = 92; + this.wmTextBox47.Visible = false; + // + // wmLabel47 + // + this.wmLabel47.AutoSize = true; + this.wmLabel47.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel47.Location = new System.Drawing.Point(595, 733); + this.wmLabel47.Name = "wmLabel47"; + this.wmLabel47.Size = new System.Drawing.Size(24, 16); + this.wmLabel47.TabIndex = 91; + this.wmLabel47.Text = "47"; + this.wmLabel47.Visible = false; + // + // wmTextBox46 + // + this.wmTextBox46.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox46.Location = new System.Drawing.Point(720, 698); + this.wmTextBox46.Name = "wmTextBox46"; + this.wmTextBox46.Size = new System.Drawing.Size(380, 23); + this.wmTextBox46.TabIndex = 90; + this.wmTextBox46.Visible = false; + // + // wmLabel46 + // + this.wmLabel46.AutoSize = true; + this.wmLabel46.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel46.Location = new System.Drawing.Point(595, 704); + this.wmLabel46.Name = "wmLabel46"; + this.wmLabel46.Size = new System.Drawing.Size(24, 16); + this.wmLabel46.TabIndex = 89; + this.wmLabel46.Text = "46"; + this.wmLabel46.Visible = false; + // + // wmTextBox45 + // + this.wmTextBox45.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox45.Location = new System.Drawing.Point(720, 669); + this.wmTextBox45.Name = "wmTextBox45"; + this.wmTextBox45.Size = new System.Drawing.Size(380, 23); + this.wmTextBox45.TabIndex = 88; + this.wmTextBox45.Visible = false; + // + // wmLabel45 + // + this.wmLabel45.AutoSize = true; + this.wmLabel45.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel45.Location = new System.Drawing.Point(595, 675); + this.wmLabel45.Name = "wmLabel45"; + this.wmLabel45.Size = new System.Drawing.Size(24, 16); + this.wmLabel45.TabIndex = 87; + this.wmLabel45.Text = "45"; + this.wmLabel45.Visible = false; + // + // wmTextBox44 + // + this.wmTextBox44.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox44.Location = new System.Drawing.Point(720, 640); + this.wmTextBox44.Name = "wmTextBox44"; + this.wmTextBox44.Size = new System.Drawing.Size(380, 23); + this.wmTextBox44.TabIndex = 86; + this.wmTextBox44.Visible = false; + // + // wmLabel44 + // + this.wmLabel44.AutoSize = true; + this.wmLabel44.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel44.Location = new System.Drawing.Point(595, 647); + this.wmLabel44.Name = "wmLabel44"; + this.wmLabel44.Size = new System.Drawing.Size(24, 16); + this.wmLabel44.TabIndex = 85; + this.wmLabel44.Text = "44"; + this.wmLabel44.Visible = false; + // + // wmTextBox43 + // + this.wmTextBox43.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox43.Location = new System.Drawing.Point(720, 611); + this.wmTextBox43.Name = "wmTextBox43"; + this.wmTextBox43.Size = new System.Drawing.Size(380, 23); + this.wmTextBox43.TabIndex = 84; + this.wmTextBox43.Visible = false; + // + // wmLabel43 + // + this.wmLabel43.AutoSize = true; + this.wmLabel43.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel43.Location = new System.Drawing.Point(595, 618); + this.wmLabel43.Name = "wmLabel43"; + this.wmLabel43.Size = new System.Drawing.Size(24, 16); + this.wmLabel43.TabIndex = 83; + this.wmLabel43.Text = "43"; + this.wmLabel43.Visible = false; + // + // wmTextBox42 + // + this.wmTextBox42.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox42.Location = new System.Drawing.Point(720, 582); + this.wmTextBox42.Name = "wmTextBox42"; + this.wmTextBox42.Size = new System.Drawing.Size(380, 23); + this.wmTextBox42.TabIndex = 78; + this.wmTextBox42.Visible = false; + // + // wmLabel42 + // + this.wmLabel42.AutoSize = true; + this.wmLabel42.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel42.Location = new System.Drawing.Point(595, 589); + this.wmLabel42.Name = "wmLabel42"; + this.wmLabel42.Size = new System.Drawing.Size(24, 16); + this.wmLabel42.TabIndex = 74; + this.wmLabel42.Text = "42"; + this.wmLabel42.Visible = false; + // + // wmTextBox41 + // + this.wmTextBox41.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox41.Location = new System.Drawing.Point(720, 553); + this.wmTextBox41.Name = "wmTextBox41"; + this.wmTextBox41.Size = new System.Drawing.Size(380, 23); + this.wmTextBox41.TabIndex = 77; + this.wmTextBox41.Visible = false; + // + // wmLabel41 + // + this.wmLabel41.AutoSize = true; + this.wmLabel41.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel41.Location = new System.Drawing.Point(595, 559); + this.wmLabel41.Name = "wmLabel41"; + this.wmLabel41.Size = new System.Drawing.Size(24, 16); + this.wmLabel41.TabIndex = 73; + this.wmLabel41.Text = "41"; + this.wmLabel41.Visible = false; + // + // wmTextBox40 + // + this.wmTextBox40.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox40.Location = new System.Drawing.Point(720, 524); + this.wmTextBox40.Name = "wmTextBox40"; + this.wmTextBox40.Size = new System.Drawing.Size(380, 23); + this.wmTextBox40.TabIndex = 81; + this.wmTextBox40.Visible = false; + // + // wmLabel40 + // + this.wmLabel40.AutoSize = true; + this.wmLabel40.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel40.Location = new System.Drawing.Point(595, 530); + this.wmLabel40.Name = "wmLabel40"; + this.wmLabel40.Size = new System.Drawing.Size(24, 16); + this.wmLabel40.TabIndex = 72; + this.wmLabel40.Text = "40"; + this.wmLabel40.Visible = false; + // + // wmTextBox39 + // + this.wmTextBox39.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox39.Location = new System.Drawing.Point(720, 495); + this.wmTextBox39.Name = "wmTextBox39"; + this.wmTextBox39.Size = new System.Drawing.Size(380, 23); + this.wmTextBox39.TabIndex = 82; + this.wmTextBox39.Visible = false; + // + // wmLabel39 + // + this.wmLabel39.AutoSize = true; + this.wmLabel39.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel39.Location = new System.Drawing.Point(595, 501); + this.wmLabel39.Name = "wmLabel39"; + this.wmLabel39.Size = new System.Drawing.Size(24, 16); + this.wmLabel39.TabIndex = 71; + this.wmLabel39.Text = "39"; + this.wmLabel39.Visible = false; + // + // wmTextBox38 + // + this.wmTextBox38.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox38.Location = new System.Drawing.Point(720, 466); + this.wmTextBox38.Name = "wmTextBox38"; + this.wmTextBox38.Size = new System.Drawing.Size(380, 23); + this.wmTextBox38.TabIndex = 79; + this.wmTextBox38.Visible = false; + // + // wmLabel38 + // + this.wmLabel38.AutoSize = true; + this.wmLabel38.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel38.Location = new System.Drawing.Point(595, 472); + this.wmLabel38.Name = "wmLabel38"; + this.wmLabel38.Size = new System.Drawing.Size(24, 16); + this.wmLabel38.TabIndex = 76; + this.wmLabel38.Text = "38"; + this.wmLabel38.Visible = false; + // + // wmTextBox37 + // + this.wmTextBox37.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox37.Location = new System.Drawing.Point(720, 437); + this.wmTextBox37.Name = "wmTextBox37"; + this.wmTextBox37.Size = new System.Drawing.Size(380, 23); + this.wmTextBox37.TabIndex = 80; + this.wmTextBox37.Visible = false; + // + // wmLabel37 + // + this.wmLabel37.AutoSize = true; + this.wmLabel37.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel37.Location = new System.Drawing.Point(595, 443); + this.wmLabel37.Name = "wmLabel37"; + this.wmLabel37.Size = new System.Drawing.Size(24, 16); + this.wmLabel37.TabIndex = 75; + this.wmLabel37.Text = "37"; + this.wmLabel37.Visible = false; + // + // wmTextBox36 + // + this.wmTextBox36.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox36.Location = new System.Drawing.Point(720, 408); + this.wmTextBox36.Name = "wmTextBox36"; + this.wmTextBox36.Size = new System.Drawing.Size(380, 23); + this.wmTextBox36.TabIndex = 70; + this.wmTextBox36.Visible = false; + // + // wmLabel36 + // + this.wmLabel36.AutoSize = true; + this.wmLabel36.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel36.Location = new System.Drawing.Point(595, 414); + this.wmLabel36.Name = "wmLabel36"; + this.wmLabel36.Size = new System.Drawing.Size(24, 16); + this.wmLabel36.TabIndex = 69; + this.wmLabel36.Text = "36"; + this.wmLabel36.Visible = false; + // + // wmTextBox35 + // + this.wmTextBox35.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox35.Location = new System.Drawing.Point(720, 379); + this.wmTextBox35.Name = "wmTextBox35"; + this.wmTextBox35.Size = new System.Drawing.Size(380, 23); + this.wmTextBox35.TabIndex = 68; + this.wmTextBox35.Visible = false; + // + // wmLabel35 + // + this.wmLabel35.AutoSize = true; + this.wmLabel35.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel35.Location = new System.Drawing.Point(595, 385); + this.wmLabel35.Name = "wmLabel35"; + this.wmLabel35.Size = new System.Drawing.Size(24, 16); + this.wmLabel35.TabIndex = 67; + this.wmLabel35.Text = "35"; + this.wmLabel35.Visible = false; + // + // wmTextBox34 + // + this.wmTextBox34.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox34.Location = new System.Drawing.Point(720, 350); + this.wmTextBox34.Name = "wmTextBox34"; + this.wmTextBox34.Size = new System.Drawing.Size(380, 23); + this.wmTextBox34.TabIndex = 66; + this.wmTextBox34.Visible = false; + // + // wmLabel34 + // + this.wmLabel34.AutoSize = true; + this.wmLabel34.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel34.Location = new System.Drawing.Point(595, 356); + this.wmLabel34.Name = "wmLabel34"; + this.wmLabel34.Size = new System.Drawing.Size(24, 16); + this.wmLabel34.TabIndex = 65; + this.wmLabel34.Text = "34"; + this.wmLabel34.Visible = false; + // + // wmTextBox33 + // + this.wmTextBox33.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox33.Location = new System.Drawing.Point(720, 321); + this.wmTextBox33.Name = "wmTextBox33"; + this.wmTextBox33.Size = new System.Drawing.Size(380, 23); + this.wmTextBox33.TabIndex = 64; + this.wmTextBox33.Visible = false; + // + // wmLabel33 + // + this.wmLabel33.AutoSize = true; + this.wmLabel33.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel33.Location = new System.Drawing.Point(595, 327); + this.wmLabel33.Name = "wmLabel33"; + this.wmLabel33.Size = new System.Drawing.Size(24, 16); + this.wmLabel33.TabIndex = 63; + this.wmLabel33.Text = "33"; + this.wmLabel33.Visible = false; + // + // wmTextBox32 + // + this.wmTextBox32.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox32.Location = new System.Drawing.Point(720, 292); + this.wmTextBox32.Name = "wmTextBox32"; + this.wmTextBox32.Size = new System.Drawing.Size(380, 23); + this.wmTextBox32.TabIndex = 62; + this.wmTextBox32.Visible = false; + // + // wmLabel32 + // + this.wmLabel32.AutoSize = true; + this.wmLabel32.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel32.Location = new System.Drawing.Point(595, 299); + this.wmLabel32.Name = "wmLabel32"; + this.wmLabel32.Size = new System.Drawing.Size(24, 16); + this.wmLabel32.TabIndex = 61; + this.wmLabel32.Text = "32"; + this.wmLabel32.Visible = false; + // + // wmTextBox31 + // + this.wmTextBox31.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox31.Location = new System.Drawing.Point(720, 263); + this.wmTextBox31.Name = "wmTextBox31"; + this.wmTextBox31.Size = new System.Drawing.Size(380, 23); + this.wmTextBox31.TabIndex = 60; + this.wmTextBox31.Visible = false; + // + // wmLabel31 + // + this.wmLabel31.AutoSize = true; + this.wmLabel31.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel31.Location = new System.Drawing.Point(595, 270); + this.wmLabel31.Name = "wmLabel31"; + this.wmLabel31.Size = new System.Drawing.Size(24, 16); + this.wmLabel31.TabIndex = 59; + this.wmLabel31.Text = "31"; + this.wmLabel31.Visible = false; + // + // wmTextBox30 + // + this.wmTextBox30.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox30.Location = new System.Drawing.Point(720, 234); + this.wmTextBox30.Name = "wmTextBox30"; + this.wmTextBox30.Size = new System.Drawing.Size(380, 23); + this.wmTextBox30.TabIndex = 54; + this.wmTextBox30.Visible = false; + // + // wmLabel30 + // + this.wmLabel30.AutoSize = true; + this.wmLabel30.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel30.Location = new System.Drawing.Point(595, 241); + this.wmLabel30.Name = "wmLabel30"; + this.wmLabel30.Size = new System.Drawing.Size(24, 16); + this.wmLabel30.TabIndex = 50; + this.wmLabel30.Text = "30"; + this.wmLabel30.Visible = false; + // + // wmTextBox29 + // + this.wmTextBox29.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox29.Location = new System.Drawing.Point(720, 205); + this.wmTextBox29.Name = "wmTextBox29"; + this.wmTextBox29.Size = new System.Drawing.Size(380, 23); + this.wmTextBox29.TabIndex = 53; + this.wmTextBox29.Visible = false; + // + // wmLabel29 + // + this.wmLabel29.AutoSize = true; + this.wmLabel29.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel29.Location = new System.Drawing.Point(595, 211); + this.wmLabel29.Name = "wmLabel29"; + this.wmLabel29.Size = new System.Drawing.Size(24, 16); + this.wmLabel29.TabIndex = 49; + this.wmLabel29.Text = "29"; + this.wmLabel29.Visible = false; + // + // wmTextBox28 + // + this.wmTextBox28.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox28.Location = new System.Drawing.Point(720, 176); + this.wmTextBox28.Name = "wmTextBox28"; + this.wmTextBox28.Size = new System.Drawing.Size(380, 23); + this.wmTextBox28.TabIndex = 57; + this.wmTextBox28.Visible = false; + // + // wmLabel28 + // + this.wmLabel28.AutoSize = true; + this.wmLabel28.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel28.Location = new System.Drawing.Point(595, 182); + this.wmLabel28.Name = "wmLabel28"; + this.wmLabel28.Size = new System.Drawing.Size(24, 16); + this.wmLabel28.TabIndex = 48; + this.wmLabel28.Text = "28"; + this.wmLabel28.Visible = false; + // + // wmTextBox27 + // + this.wmTextBox27.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox27.Location = new System.Drawing.Point(720, 147); + this.wmTextBox27.Name = "wmTextBox27"; + this.wmTextBox27.Size = new System.Drawing.Size(380, 23); + this.wmTextBox27.TabIndex = 58; + this.wmTextBox27.Visible = false; + // + // wmLabel27 + // + this.wmLabel27.AutoSize = true; + this.wmLabel27.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel27.Location = new System.Drawing.Point(595, 153); + this.wmLabel27.Name = "wmLabel27"; + this.wmLabel27.Size = new System.Drawing.Size(24, 16); + this.wmLabel27.TabIndex = 47; + this.wmLabel27.Text = "27"; + this.wmLabel27.Visible = false; + // + // wmTextBox26 + // + this.wmTextBox26.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox26.Location = new System.Drawing.Point(720, 118); + this.wmTextBox26.Name = "wmTextBox26"; + this.wmTextBox26.Size = new System.Drawing.Size(380, 23); + this.wmTextBox26.TabIndex = 55; + this.wmTextBox26.Visible = false; + // + // wmLabel26 + // + this.wmLabel26.AutoSize = true; + this.wmLabel26.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel26.Location = new System.Drawing.Point(595, 124); + this.wmLabel26.Name = "wmLabel26"; + this.wmLabel26.Size = new System.Drawing.Size(24, 16); + this.wmLabel26.TabIndex = 52; + this.wmLabel26.Text = "26"; + this.wmLabel26.Visible = false; + // + // wmTextBox25 + // + this.wmTextBox25.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmTextBox25.Location = new System.Drawing.Point(720, 89); + this.wmTextBox25.Name = "wmTextBox25"; + this.wmTextBox25.Size = new System.Drawing.Size(380, 23); + this.wmTextBox25.TabIndex = 56; + this.wmTextBox25.Visible = false; + // + // wmLabel25 + // + this.wmLabel25.AutoSize = true; + this.wmLabel25.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.wmLabel25.Location = new System.Drawing.Point(595, 95); + this.wmLabel25.Name = "wmLabel25"; + this.wmLabel25.Size = new System.Drawing.Size(24, 16); + this.wmLabel25.TabIndex = 51; + this.wmLabel25.Text = "25"; + this.wmLabel25.Visible = false; + // + // activityLabel + // + this.activityLabel.AutoSize = true; + this.activityLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 27.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.activityLabel.Location = new System.Drawing.Point(189, 22); + this.activityLabel.Name = "activityLabel"; + this.activityLabel.Size = new System.Drawing.Size(225, 42); + this.activityLabel.TabIndex = 95; + this.activityLabel.Text = "Activity label"; + // + // pictureBox48 + // + this.pictureBox48.Location = new System.Drawing.Point(680, 756); + this.pictureBox48.Name = "pictureBox48"; + this.pictureBox48.Size = new System.Drawing.Size(23, 23); + this.pictureBox48.TabIndex = 143; + this.pictureBox48.TabStop = false; + // + // pictureBox47 + // + this.pictureBox47.Location = new System.Drawing.Point(680, 727); + this.pictureBox47.Name = "pictureBox47"; + this.pictureBox47.Size = new System.Drawing.Size(23, 23); + this.pictureBox47.TabIndex = 142; + this.pictureBox47.TabStop = false; + // + // pictureBox46 + // + this.pictureBox46.Location = new System.Drawing.Point(680, 698); + this.pictureBox46.Name = "pictureBox46"; + this.pictureBox46.Size = new System.Drawing.Size(23, 23); + this.pictureBox46.TabIndex = 141; + this.pictureBox46.TabStop = false; + // + // pictureBox45 + // + this.pictureBox45.Location = new System.Drawing.Point(680, 669); + this.pictureBox45.Name = "pictureBox45"; + this.pictureBox45.Size = new System.Drawing.Size(23, 23); + this.pictureBox45.TabIndex = 140; + this.pictureBox45.TabStop = false; + // + // pictureBox44 + // + this.pictureBox44.Location = new System.Drawing.Point(680, 640); + this.pictureBox44.Name = "pictureBox44"; + this.pictureBox44.Size = new System.Drawing.Size(23, 23); + this.pictureBox44.TabIndex = 139; + this.pictureBox44.TabStop = false; + // + // pictureBox43 + // + this.pictureBox43.Location = new System.Drawing.Point(680, 611); + this.pictureBox43.Name = "pictureBox43"; + this.pictureBox43.Size = new System.Drawing.Size(23, 23); + this.pictureBox43.TabIndex = 138; + this.pictureBox43.TabStop = false; + // + // pictureBox42 + // + this.pictureBox42.Location = new System.Drawing.Point(680, 582); + this.pictureBox42.Name = "pictureBox42"; + this.pictureBox42.Size = new System.Drawing.Size(23, 23); + this.pictureBox42.TabIndex = 137; + this.pictureBox42.TabStop = false; + // + // pictureBox41 + // + this.pictureBox41.Location = new System.Drawing.Point(680, 553); + this.pictureBox41.Name = "pictureBox41"; + this.pictureBox41.Size = new System.Drawing.Size(23, 23); + this.pictureBox41.TabIndex = 136; + this.pictureBox41.TabStop = false; + // + // pictureBox40 + // + this.pictureBox40.Location = new System.Drawing.Point(680, 524); + this.pictureBox40.Name = "pictureBox40"; + this.pictureBox40.Size = new System.Drawing.Size(23, 23); + this.pictureBox40.TabIndex = 135; + this.pictureBox40.TabStop = false; + // + // pictureBox39 + // + this.pictureBox39.Location = new System.Drawing.Point(680, 495); + this.pictureBox39.Name = "pictureBox39"; + this.pictureBox39.Size = new System.Drawing.Size(23, 23); + this.pictureBox39.TabIndex = 134; + this.pictureBox39.TabStop = false; + // + // pictureBox38 + // + this.pictureBox38.Location = new System.Drawing.Point(680, 466); + this.pictureBox38.Name = "pictureBox38"; + this.pictureBox38.Size = new System.Drawing.Size(23, 23); + this.pictureBox38.TabIndex = 133; + this.pictureBox38.TabStop = false; + // + // pictureBox37 + // + this.pictureBox37.Location = new System.Drawing.Point(680, 437); + this.pictureBox37.Name = "pictureBox37"; + this.pictureBox37.Size = new System.Drawing.Size(23, 23); + this.pictureBox37.TabIndex = 132; + this.pictureBox37.TabStop = false; + // + // pictureBox36 + // + this.pictureBox36.Location = new System.Drawing.Point(680, 408); + this.pictureBox36.Name = "pictureBox36"; + this.pictureBox36.Size = new System.Drawing.Size(23, 23); + this.pictureBox36.TabIndex = 131; + this.pictureBox36.TabStop = false; + // + // pictureBox35 + // + this.pictureBox35.Location = new System.Drawing.Point(680, 379); + this.pictureBox35.Name = "pictureBox35"; + this.pictureBox35.Size = new System.Drawing.Size(23, 23); + this.pictureBox35.TabIndex = 130; + this.pictureBox35.TabStop = false; + // + // pictureBox34 + // + this.pictureBox34.Location = new System.Drawing.Point(680, 350); + this.pictureBox34.Name = "pictureBox34"; + this.pictureBox34.Size = new System.Drawing.Size(23, 23); + this.pictureBox34.TabIndex = 129; + this.pictureBox34.TabStop = false; + // + // pictureBox33 + // + this.pictureBox33.Location = new System.Drawing.Point(680, 321); + this.pictureBox33.Name = "pictureBox33"; + this.pictureBox33.Size = new System.Drawing.Size(23, 23); + this.pictureBox33.TabIndex = 128; + this.pictureBox33.TabStop = false; + // + // pictureBox32 + // + this.pictureBox32.Location = new System.Drawing.Point(680, 292); + this.pictureBox32.Name = "pictureBox32"; + this.pictureBox32.Size = new System.Drawing.Size(23, 23); + this.pictureBox32.TabIndex = 127; + this.pictureBox32.TabStop = false; + // + // pictureBox31 + // + this.pictureBox31.Location = new System.Drawing.Point(680, 263); + this.pictureBox31.Name = "pictureBox31"; + this.pictureBox31.Size = new System.Drawing.Size(23, 23); + this.pictureBox31.TabIndex = 126; + this.pictureBox31.TabStop = false; + // + // pictureBox30 + // + this.pictureBox30.Location = new System.Drawing.Point(680, 234); + this.pictureBox30.Name = "pictureBox30"; + this.pictureBox30.Size = new System.Drawing.Size(23, 23); + this.pictureBox30.TabIndex = 125; + this.pictureBox30.TabStop = false; + // + // pictureBox29 + // + this.pictureBox29.Location = new System.Drawing.Point(680, 205); + this.pictureBox29.Name = "pictureBox29"; + this.pictureBox29.Size = new System.Drawing.Size(23, 23); + this.pictureBox29.TabIndex = 124; + this.pictureBox29.TabStop = false; + // + // pictureBox28 + // + this.pictureBox28.Location = new System.Drawing.Point(680, 176); + this.pictureBox28.Name = "pictureBox28"; + this.pictureBox28.Size = new System.Drawing.Size(23, 23); + this.pictureBox28.TabIndex = 123; + this.pictureBox28.TabStop = false; + // + // pictureBox27 + // + this.pictureBox27.Location = new System.Drawing.Point(680, 147); + this.pictureBox27.Name = "pictureBox27"; + this.pictureBox27.Size = new System.Drawing.Size(23, 23); + this.pictureBox27.TabIndex = 122; + this.pictureBox27.TabStop = false; + // + // pictureBox26 + // + this.pictureBox26.Location = new System.Drawing.Point(680, 118); + this.pictureBox26.Name = "pictureBox26"; + this.pictureBox26.Size = new System.Drawing.Size(23, 23); + this.pictureBox26.TabIndex = 121; + this.pictureBox26.TabStop = false; + // + // pictureBox25 + // + this.pictureBox25.Location = new System.Drawing.Point(680, 89); + this.pictureBox25.Name = "pictureBox25"; + this.pictureBox25.Size = new System.Drawing.Size(23, 23); + this.pictureBox25.TabIndex = 120; + this.pictureBox25.TabStop = false; + // + // pictureBox24 + // + this.pictureBox24.Location = new System.Drawing.Point(120, 756); + this.pictureBox24.Name = "pictureBox24"; + this.pictureBox24.Size = new System.Drawing.Size(23, 23); + this.pictureBox24.TabIndex = 119; + this.pictureBox24.TabStop = false; + // + // pictureBox23 + // + this.pictureBox23.Location = new System.Drawing.Point(120, 727); + this.pictureBox23.Name = "pictureBox23"; + this.pictureBox23.Size = new System.Drawing.Size(23, 23); + this.pictureBox23.TabIndex = 118; + this.pictureBox23.TabStop = false; + // + // pictureBox22 + // + this.pictureBox22.Location = new System.Drawing.Point(120, 698); + this.pictureBox22.Name = "pictureBox22"; + this.pictureBox22.Size = new System.Drawing.Size(23, 23); + this.pictureBox22.TabIndex = 117; + this.pictureBox22.TabStop = false; + // + // pictureBox21 + // + this.pictureBox21.Location = new System.Drawing.Point(120, 669); + this.pictureBox21.Name = "pictureBox21"; + this.pictureBox21.Size = new System.Drawing.Size(23, 23); + this.pictureBox21.TabIndex = 116; + this.pictureBox21.TabStop = false; + // + // pictureBox20 + // + this.pictureBox20.Location = new System.Drawing.Point(120, 640); + this.pictureBox20.Name = "pictureBox20"; + this.pictureBox20.Size = new System.Drawing.Size(23, 23); + this.pictureBox20.TabIndex = 115; + this.pictureBox20.TabStop = false; + // + // pictureBox19 + // + this.pictureBox19.Location = new System.Drawing.Point(120, 611); + this.pictureBox19.Name = "pictureBox19"; + this.pictureBox19.Size = new System.Drawing.Size(23, 23); + this.pictureBox19.TabIndex = 114; + this.pictureBox19.TabStop = false; + // + // pictureBox18 + // + this.pictureBox18.Location = new System.Drawing.Point(120, 582); + this.pictureBox18.Name = "pictureBox18"; + this.pictureBox18.Size = new System.Drawing.Size(23, 23); + this.pictureBox18.TabIndex = 113; + this.pictureBox18.TabStop = false; + // + // pictureBox17 + // + this.pictureBox17.Location = new System.Drawing.Point(120, 553); + this.pictureBox17.Name = "pictureBox17"; + this.pictureBox17.Size = new System.Drawing.Size(23, 23); + this.pictureBox17.TabIndex = 112; + this.pictureBox17.TabStop = false; + // + // pictureBox16 + // + this.pictureBox16.Location = new System.Drawing.Point(120, 524); + this.pictureBox16.Name = "pictureBox16"; + this.pictureBox16.Size = new System.Drawing.Size(23, 23); + this.pictureBox16.TabIndex = 111; + this.pictureBox16.TabStop = false; + // + // pictureBox15 + // + this.pictureBox15.Location = new System.Drawing.Point(120, 495); + this.pictureBox15.Name = "pictureBox15"; + this.pictureBox15.Size = new System.Drawing.Size(23, 23); + this.pictureBox15.TabIndex = 110; + this.pictureBox15.TabStop = false; + // + // pictureBox14 + // + this.pictureBox14.Location = new System.Drawing.Point(120, 466); + this.pictureBox14.Name = "pictureBox14"; + this.pictureBox14.Size = new System.Drawing.Size(23, 23); + this.pictureBox14.TabIndex = 109; + this.pictureBox14.TabStop = false; + // + // pictureBox13 + // + this.pictureBox13.Location = new System.Drawing.Point(120, 437); + this.pictureBox13.Name = "pictureBox13"; + this.pictureBox13.Size = new System.Drawing.Size(23, 23); + this.pictureBox13.TabIndex = 108; + this.pictureBox13.TabStop = false; + // + // pictureBox12 + // + this.pictureBox12.Location = new System.Drawing.Point(120, 408); + this.pictureBox12.Name = "pictureBox12"; + this.pictureBox12.Size = new System.Drawing.Size(23, 23); + this.pictureBox12.TabIndex = 107; + this.pictureBox12.TabStop = false; + // + // pictureBox11 + // + this.pictureBox11.Location = new System.Drawing.Point(120, 379); + this.pictureBox11.Name = "pictureBox11"; + this.pictureBox11.Size = new System.Drawing.Size(23, 23); + this.pictureBox11.TabIndex = 106; + this.pictureBox11.TabStop = false; + // + // pictureBox10 + // + this.pictureBox10.Location = new System.Drawing.Point(120, 350); + this.pictureBox10.Name = "pictureBox10"; + this.pictureBox10.Size = new System.Drawing.Size(23, 23); + this.pictureBox10.TabIndex = 105; + this.pictureBox10.TabStop = false; + // + // pictureBox9 + // + this.pictureBox9.Location = new System.Drawing.Point(120, 321); + this.pictureBox9.Name = "pictureBox9"; + this.pictureBox9.Size = new System.Drawing.Size(23, 23); + this.pictureBox9.TabIndex = 104; + this.pictureBox9.TabStop = false; + // + // pictureBox8 + // + this.pictureBox8.Location = new System.Drawing.Point(120, 292); + this.pictureBox8.Name = "pictureBox8"; + this.pictureBox8.Size = new System.Drawing.Size(23, 23); + this.pictureBox8.TabIndex = 103; + this.pictureBox8.TabStop = false; + // + // pictureBox7 + // + this.pictureBox7.Location = new System.Drawing.Point(120, 263); + this.pictureBox7.Name = "pictureBox7"; + this.pictureBox7.Size = new System.Drawing.Size(23, 23); + this.pictureBox7.TabIndex = 102; + this.pictureBox7.TabStop = false; + // + // pictureBox6 + // + this.pictureBox6.Location = new System.Drawing.Point(120, 234); + this.pictureBox6.Name = "pictureBox6"; + this.pictureBox6.Size = new System.Drawing.Size(23, 23); + this.pictureBox6.TabIndex = 101; + this.pictureBox6.TabStop = false; + // + // pictureBox5 + // + this.pictureBox5.Location = new System.Drawing.Point(120, 205); + this.pictureBox5.Name = "pictureBox5"; + this.pictureBox5.Size = new System.Drawing.Size(23, 23); + this.pictureBox5.TabIndex = 100; + this.pictureBox5.TabStop = false; + // + // pictureBox4 + // + this.pictureBox4.Location = new System.Drawing.Point(120, 176); + this.pictureBox4.Name = "pictureBox4"; + this.pictureBox4.Size = new System.Drawing.Size(23, 23); + this.pictureBox4.TabIndex = 99; + this.pictureBox4.TabStop = false; + // + // pictureBox3 + // + this.pictureBox3.Location = new System.Drawing.Point(120, 147); + this.pictureBox3.Name = "pictureBox3"; + this.pictureBox3.Size = new System.Drawing.Size(23, 23); + this.pictureBox3.TabIndex = 98; + this.pictureBox3.TabStop = false; + // + // pictureBox2 + // + this.pictureBox2.Location = new System.Drawing.Point(120, 118); + this.pictureBox2.Name = "pictureBox2"; + this.pictureBox2.Size = new System.Drawing.Size(23, 23); + this.pictureBox2.TabIndex = 97; + this.pictureBox2.TabStop = false; + // + // pictureBox1 + // + this.pictureBox1.Location = new System.Drawing.Point(120, 89); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(23, 23); + this.pictureBox1.TabIndex = 96; + this.pictureBox1.TabStop = false; + // + // saveButton + // + this.saveButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.saveButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.saveButton.Location = new System.Drawing.Point(1025, 22); + this.saveButton.Name = "saveButton"; + this.saveButton.Size = new System.Drawing.Size(75, 42); + this.saveButton.TabIndex = 192; + this.saveButton.Text = "Save"; + this.saveButton.UseVisualStyleBackColor = true; + this.saveButton.Visible = false; + this.saveButton.Click += new System.EventHandler(this.saveButton_Click); + // + // samplePictureBox1 + // + this.samplePictureBox1.Location = new System.Drawing.Point(7, 7); + this.samplePictureBox1.Name = "samplePictureBox1"; + this.samplePictureBox1.Size = new System.Drawing.Size(23, 23); + this.samplePictureBox1.TabIndex = 193; + this.samplePictureBox1.TabStop = false; + // + // samplePictureBox2 + // + this.samplePictureBox2.Location = new System.Drawing.Point(7, 32); + this.samplePictureBox2.Name = "samplePictureBox2"; + this.samplePictureBox2.Size = new System.Drawing.Size(23, 23); + this.samplePictureBox2.TabIndex = 194; + this.samplePictureBox2.TabStop = false; + // + // samplePictureBox3 + // + this.samplePictureBox3.Location = new System.Drawing.Point(7, 57); + this.samplePictureBox3.Name = "samplePictureBox3"; + this.samplePictureBox3.Size = new System.Drawing.Size(23, 23); + this.samplePictureBox3.TabIndex = 195; + this.samplePictureBox3.TabStop = false; + // + // sampleLabel1 + // + this.sampleLabel1.AutoSize = true; + this.sampleLabel1.Location = new System.Drawing.Point(36, 12); + this.sampleLabel1.Name = "sampleLabel1"; + this.sampleLabel1.Size = new System.Drawing.Size(139, 13); + this.sampleLabel1.TabIndex = 196; + this.sampleLabel1.Text = "Direction and pulses are OK"; + // + // sampleLabel2 + // + this.sampleLabel2.AutoSize = true; + this.sampleLabel2.Location = new System.Drawing.Point(36, 37); + this.sampleLabel2.Name = "sampleLabel2"; + this.sampleLabel2.Size = new System.Drawing.Size(125, 13); + this.sampleLabel2.TabIndex = 197; + this.sampleLabel2.Text = "There are no opto pulses"; + // + // sampleLabel3 + // + this.sampleLabel3.AutoSize = true; + this.sampleLabel3.Location = new System.Drawing.Point(36, 62); + this.sampleLabel3.Name = "sampleLabel3"; + this.sampleLabel3.Size = new System.Drawing.Size(85, 13); + this.sampleLabel3.TabIndex = 198; + this.sampleLabel3.Text = "Direction is NOK"; + // + // checkBoxImage48 + // + this.checkBoxImage48.Checked = false; + this.checkBoxImage48.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage48.Image"))); + this.checkBoxImage48.Location = new System.Drawing.Point(630, 758); + this.checkBoxImage48.Name = "checkBoxImage48"; + this.checkBoxImage48.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage48.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage48.TabIndex = 191; + this.checkBoxImage48.TabStop = false; + this.checkBoxImage48.Visible = false; + this.checkBoxImage48.Click += new System.EventHandler(this.checkBoxImage48_Click); + // + // checkBoxImage47 + // + this.checkBoxImage47.Checked = false; + this.checkBoxImage47.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage47.Image"))); + this.checkBoxImage47.Location = new System.Drawing.Point(630, 729); + this.checkBoxImage47.Name = "checkBoxImage47"; + this.checkBoxImage47.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage47.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage47.TabIndex = 190; + this.checkBoxImage47.TabStop = false; + this.checkBoxImage47.Visible = false; + this.checkBoxImage47.Click += new System.EventHandler(this.checkBoxImage47_Click); + // + // checkBoxImage46 + // + this.checkBoxImage46.Checked = false; + this.checkBoxImage46.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage46.Image"))); + this.checkBoxImage46.Location = new System.Drawing.Point(630, 700); + this.checkBoxImage46.Name = "checkBoxImage46"; + this.checkBoxImage46.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage46.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage46.TabIndex = 189; + this.checkBoxImage46.TabStop = false; + this.checkBoxImage46.Visible = false; + this.checkBoxImage46.Click += new System.EventHandler(this.checkBoxImage46_Click); + // + // checkBoxImage45 + // + this.checkBoxImage45.Checked = false; + this.checkBoxImage45.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage45.Image"))); + this.checkBoxImage45.Location = new System.Drawing.Point(630, 671); + this.checkBoxImage45.Name = "checkBoxImage45"; + this.checkBoxImage45.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage45.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage45.TabIndex = 188; + this.checkBoxImage45.TabStop = false; + this.checkBoxImage45.Visible = false; + this.checkBoxImage45.Click += new System.EventHandler(this.checkBoxImage45_Click); + // + // checkBoxImage44 + // + this.checkBoxImage44.Checked = false; + this.checkBoxImage44.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage44.Image"))); + this.checkBoxImage44.Location = new System.Drawing.Point(630, 642); + this.checkBoxImage44.Name = "checkBoxImage44"; + this.checkBoxImage44.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage44.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage44.TabIndex = 187; + this.checkBoxImage44.TabStop = false; + this.checkBoxImage44.Visible = false; + this.checkBoxImage44.Click += new System.EventHandler(this.checkBoxImage44_Click); + // + // checkBoxImage43 + // + this.checkBoxImage43.Checked = false; + this.checkBoxImage43.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage43.Image"))); + this.checkBoxImage43.Location = new System.Drawing.Point(630, 613); + this.checkBoxImage43.Name = "checkBoxImage43"; + this.checkBoxImage43.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage43.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage43.TabIndex = 186; + this.checkBoxImage43.TabStop = false; + this.checkBoxImage43.Visible = false; + this.checkBoxImage43.Click += new System.EventHandler(this.checkBoxImage43_Click); + // + // checkBoxImage42 + // + this.checkBoxImage42.Checked = false; + this.checkBoxImage42.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage42.Image"))); + this.checkBoxImage42.Location = new System.Drawing.Point(630, 584); + this.checkBoxImage42.Name = "checkBoxImage42"; + this.checkBoxImage42.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage42.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage42.TabIndex = 185; + this.checkBoxImage42.TabStop = false; + this.checkBoxImage42.Visible = false; + this.checkBoxImage42.Click += new System.EventHandler(this.checkBoxImage42_Click); + // + // checkBoxImage41 + // + this.checkBoxImage41.Checked = false; + this.checkBoxImage41.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage41.Image"))); + this.checkBoxImage41.Location = new System.Drawing.Point(630, 555); + this.checkBoxImage41.Name = "checkBoxImage41"; + this.checkBoxImage41.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage41.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage41.TabIndex = 184; + this.checkBoxImage41.TabStop = false; + this.checkBoxImage41.Visible = false; + this.checkBoxImage41.Click += new System.EventHandler(this.checkBoxImage41_Click); + // + // checkBoxImage40 + // + this.checkBoxImage40.Checked = false; + this.checkBoxImage40.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage40.Image"))); + this.checkBoxImage40.Location = new System.Drawing.Point(630, 526); + this.checkBoxImage40.Name = "checkBoxImage40"; + this.checkBoxImage40.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage40.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage40.TabIndex = 183; + this.checkBoxImage40.TabStop = false; + this.checkBoxImage40.Visible = false; + this.checkBoxImage40.Click += new System.EventHandler(this.checkBoxImage40_Click); + // + // checkBoxImage39 + // + this.checkBoxImage39.Checked = false; + this.checkBoxImage39.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage39.Image"))); + this.checkBoxImage39.Location = new System.Drawing.Point(630, 497); + this.checkBoxImage39.Name = "checkBoxImage39"; + this.checkBoxImage39.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage39.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage39.TabIndex = 182; + this.checkBoxImage39.TabStop = false; + this.checkBoxImage39.Visible = false; + this.checkBoxImage39.Click += new System.EventHandler(this.checkBoxImage39_Click); + // + // checkBoxImage38 + // + this.checkBoxImage38.Checked = false; + this.checkBoxImage38.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage38.Image"))); + this.checkBoxImage38.Location = new System.Drawing.Point(630, 468); + this.checkBoxImage38.Name = "checkBoxImage38"; + this.checkBoxImage38.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage38.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage38.TabIndex = 181; + this.checkBoxImage38.TabStop = false; + this.checkBoxImage38.Visible = false; + this.checkBoxImage38.Click += new System.EventHandler(this.checkBoxImage38_Click); + // + // checkBoxImage37 + // + this.checkBoxImage37.Checked = false; + this.checkBoxImage37.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage37.Image"))); + this.checkBoxImage37.Location = new System.Drawing.Point(630, 439); + this.checkBoxImage37.Name = "checkBoxImage37"; + this.checkBoxImage37.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage37.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage37.TabIndex = 180; + this.checkBoxImage37.TabStop = false; + this.checkBoxImage37.Visible = false; + this.checkBoxImage37.Click += new System.EventHandler(this.checkBoxImage37_Click); + // + // checkBoxImage36 + // + this.checkBoxImage36.Checked = false; + this.checkBoxImage36.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage36.Image"))); + this.checkBoxImage36.Location = new System.Drawing.Point(630, 410); + this.checkBoxImage36.Name = "checkBoxImage36"; + this.checkBoxImage36.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage36.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage36.TabIndex = 179; + this.checkBoxImage36.TabStop = false; + this.checkBoxImage36.Visible = false; + this.checkBoxImage36.Click += new System.EventHandler(this.checkBoxImage36_Click); + // + // checkBoxImage35 + // + this.checkBoxImage35.Checked = false; + this.checkBoxImage35.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage35.Image"))); + this.checkBoxImage35.Location = new System.Drawing.Point(630, 381); + this.checkBoxImage35.Name = "checkBoxImage35"; + this.checkBoxImage35.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage35.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage35.TabIndex = 178; + this.checkBoxImage35.TabStop = false; + this.checkBoxImage35.Visible = false; + this.checkBoxImage35.Click += new System.EventHandler(this.checkBoxImage35_Click); + // + // checkBoxImage34 + // + this.checkBoxImage34.Checked = false; + this.checkBoxImage34.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage34.Image"))); + this.checkBoxImage34.Location = new System.Drawing.Point(630, 352); + this.checkBoxImage34.Name = "checkBoxImage34"; + this.checkBoxImage34.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage34.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage34.TabIndex = 177; + this.checkBoxImage34.TabStop = false; + this.checkBoxImage34.Visible = false; + this.checkBoxImage34.Click += new System.EventHandler(this.checkBoxImage34_Click); + // + // checkBoxImage33 + // + this.checkBoxImage33.Checked = false; + this.checkBoxImage33.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage33.Image"))); + this.checkBoxImage33.Location = new System.Drawing.Point(630, 323); + this.checkBoxImage33.Name = "checkBoxImage33"; + this.checkBoxImage33.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage33.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage33.TabIndex = 176; + this.checkBoxImage33.TabStop = false; + this.checkBoxImage33.Visible = false; + this.checkBoxImage33.Click += new System.EventHandler(this.checkBoxImage33_Click); + // + // checkBoxImage32 + // + this.checkBoxImage32.Checked = false; + this.checkBoxImage32.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage32.Image"))); + this.checkBoxImage32.Location = new System.Drawing.Point(630, 294); + this.checkBoxImage32.Name = "checkBoxImage32"; + this.checkBoxImage32.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage32.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage32.TabIndex = 175; + this.checkBoxImage32.TabStop = false; + this.checkBoxImage32.Visible = false; + this.checkBoxImage32.Click += new System.EventHandler(this.checkBoxImage32_Click); + // + // checkBoxImage31 + // + this.checkBoxImage31.Checked = false; + this.checkBoxImage31.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage31.Image"))); + this.checkBoxImage31.Location = new System.Drawing.Point(630, 265); + this.checkBoxImage31.Name = "checkBoxImage31"; + this.checkBoxImage31.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage31.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage31.TabIndex = 174; + this.checkBoxImage31.TabStop = false; + this.checkBoxImage31.Visible = false; + this.checkBoxImage31.Click += new System.EventHandler(this.checkBoxImage31_Click); + // + // checkBoxImage30 + // + this.checkBoxImage30.Checked = false; + this.checkBoxImage30.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage30.Image"))); + this.checkBoxImage30.Location = new System.Drawing.Point(630, 236); + this.checkBoxImage30.Name = "checkBoxImage30"; + this.checkBoxImage30.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage30.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage30.TabIndex = 173; + this.checkBoxImage30.TabStop = false; + this.checkBoxImage30.Visible = false; + this.checkBoxImage30.Click += new System.EventHandler(this.checkBoxImage30_Click); + // + // checkBoxImage29 + // + this.checkBoxImage29.Checked = false; + this.checkBoxImage29.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage29.Image"))); + this.checkBoxImage29.Location = new System.Drawing.Point(630, 207); + this.checkBoxImage29.Name = "checkBoxImage29"; + this.checkBoxImage29.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage29.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage29.TabIndex = 172; + this.checkBoxImage29.TabStop = false; + this.checkBoxImage29.Visible = false; + this.checkBoxImage29.Click += new System.EventHandler(this.checkBoxImage29_Click); + // + // checkBoxImage28 + // + this.checkBoxImage28.Checked = false; + this.checkBoxImage28.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage28.Image"))); + this.checkBoxImage28.Location = new System.Drawing.Point(630, 178); + this.checkBoxImage28.Name = "checkBoxImage28"; + this.checkBoxImage28.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage28.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage28.TabIndex = 171; + this.checkBoxImage28.TabStop = false; + this.checkBoxImage28.Visible = false; + this.checkBoxImage28.Click += new System.EventHandler(this.checkBoxImage28_Click); + // + // checkBoxImage27 + // + this.checkBoxImage27.Checked = false; + this.checkBoxImage27.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage27.Image"))); + this.checkBoxImage27.Location = new System.Drawing.Point(630, 149); + this.checkBoxImage27.Name = "checkBoxImage27"; + this.checkBoxImage27.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage27.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage27.TabIndex = 170; + this.checkBoxImage27.TabStop = false; + this.checkBoxImage27.Visible = false; + this.checkBoxImage27.Click += new System.EventHandler(this.checkBoxImage27_Click); + // + // checkBoxImage26 + // + this.checkBoxImage26.Checked = false; + this.checkBoxImage26.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage26.Image"))); + this.checkBoxImage26.Location = new System.Drawing.Point(630, 120); + this.checkBoxImage26.Name = "checkBoxImage26"; + this.checkBoxImage26.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage26.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage26.TabIndex = 169; + this.checkBoxImage26.TabStop = false; + this.checkBoxImage26.Visible = false; + this.checkBoxImage26.Click += new System.EventHandler(this.checkBoxImage26_Click); + // + // checkBoxImage25 + // + this.checkBoxImage25.Checked = false; + this.checkBoxImage25.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage25.Image"))); + this.checkBoxImage25.Location = new System.Drawing.Point(630, 91); + this.checkBoxImage25.Name = "checkBoxImage25"; + this.checkBoxImage25.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage25.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage25.TabIndex = 168; + this.checkBoxImage25.TabStop = false; + this.checkBoxImage25.Visible = false; + this.checkBoxImage25.Click += new System.EventHandler(this.checkBoxImage25_Click); + // + // checkBoxImage24 + // + this.checkBoxImage24.Checked = false; + this.checkBoxImage24.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage24.Image"))); + this.checkBoxImage24.Location = new System.Drawing.Point(70, 758); + this.checkBoxImage24.Name = "checkBoxImage24"; + this.checkBoxImage24.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage24.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage24.TabIndex = 167; + this.checkBoxImage24.TabStop = false; + this.checkBoxImage24.Visible = false; + this.checkBoxImage24.Click += new System.EventHandler(this.checkBoxImage24_Click); + // + // checkBoxImage23 + // + this.checkBoxImage23.Checked = false; + this.checkBoxImage23.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage23.Image"))); + this.checkBoxImage23.Location = new System.Drawing.Point(70, 729); + this.checkBoxImage23.Name = "checkBoxImage23"; + this.checkBoxImage23.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage23.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage23.TabIndex = 166; + this.checkBoxImage23.TabStop = false; + this.checkBoxImage23.Visible = false; + this.checkBoxImage23.Click += new System.EventHandler(this.checkBoxImage23_Click); + // + // checkBoxImage22 + // + this.checkBoxImage22.Checked = false; + this.checkBoxImage22.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage22.Image"))); + this.checkBoxImage22.Location = new System.Drawing.Point(70, 700); + this.checkBoxImage22.Name = "checkBoxImage22"; + this.checkBoxImage22.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage22.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage22.TabIndex = 165; + this.checkBoxImage22.TabStop = false; + this.checkBoxImage22.Visible = false; + this.checkBoxImage22.Click += new System.EventHandler(this.checkBoxImage22_Click); + // + // checkBoxImage21 + // + this.checkBoxImage21.Checked = false; + this.checkBoxImage21.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage21.Image"))); + this.checkBoxImage21.Location = new System.Drawing.Point(70, 671); + this.checkBoxImage21.Name = "checkBoxImage21"; + this.checkBoxImage21.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage21.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage21.TabIndex = 164; + this.checkBoxImage21.TabStop = false; + this.checkBoxImage21.Visible = false; + this.checkBoxImage21.Click += new System.EventHandler(this.checkBoxImage21_Click); + // + // checkBoxImage20 + // + this.checkBoxImage20.Checked = false; + this.checkBoxImage20.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage20.Image"))); + this.checkBoxImage20.Location = new System.Drawing.Point(70, 642); + this.checkBoxImage20.Name = "checkBoxImage20"; + this.checkBoxImage20.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage20.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage20.TabIndex = 163; + this.checkBoxImage20.TabStop = false; + this.checkBoxImage20.Visible = false; + this.checkBoxImage20.Click += new System.EventHandler(this.checkBoxImage20_Click); + // + // checkBoxImage19 + // + this.checkBoxImage19.Checked = false; + this.checkBoxImage19.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage19.Image"))); + this.checkBoxImage19.Location = new System.Drawing.Point(70, 613); + this.checkBoxImage19.Name = "checkBoxImage19"; + this.checkBoxImage19.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage19.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage19.TabIndex = 162; + this.checkBoxImage19.TabStop = false; + this.checkBoxImage19.Visible = false; + this.checkBoxImage19.Click += new System.EventHandler(this.checkBoxImage19_Click); + // + // checkBoxImage18 + // + this.checkBoxImage18.Checked = false; + this.checkBoxImage18.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage18.Image"))); + this.checkBoxImage18.Location = new System.Drawing.Point(70, 584); + this.checkBoxImage18.Name = "checkBoxImage18"; + this.checkBoxImage18.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage18.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage18.TabIndex = 161; + this.checkBoxImage18.TabStop = false; + this.checkBoxImage18.Visible = false; + this.checkBoxImage18.Click += new System.EventHandler(this.checkBoxImage18_Click); + // + // checkBoxImage17 + // + this.checkBoxImage17.Checked = false; + this.checkBoxImage17.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage17.Image"))); + this.checkBoxImage17.Location = new System.Drawing.Point(70, 555); + this.checkBoxImage17.Name = "checkBoxImage17"; + this.checkBoxImage17.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage17.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage17.TabIndex = 160; + this.checkBoxImage17.TabStop = false; + this.checkBoxImage17.Visible = false; + this.checkBoxImage17.Click += new System.EventHandler(this.checkBoxImage17_Click); + // + // checkBoxImage16 + // + this.checkBoxImage16.Checked = false; + this.checkBoxImage16.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage16.Image"))); + this.checkBoxImage16.Location = new System.Drawing.Point(70, 526); + this.checkBoxImage16.Name = "checkBoxImage16"; + this.checkBoxImage16.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage16.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage16.TabIndex = 159; + this.checkBoxImage16.TabStop = false; + this.checkBoxImage16.Visible = false; + this.checkBoxImage16.Click += new System.EventHandler(this.checkBoxImage16_Click); + // + // checkBoxImage15 + // + this.checkBoxImage15.Checked = false; + this.checkBoxImage15.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage15.Image"))); + this.checkBoxImage15.Location = new System.Drawing.Point(70, 497); + this.checkBoxImage15.Name = "checkBoxImage15"; + this.checkBoxImage15.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage15.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage15.TabIndex = 158; + this.checkBoxImage15.TabStop = false; + this.checkBoxImage15.Visible = false; + this.checkBoxImage15.Click += new System.EventHandler(this.checkBoxImage15_Click); + // + // checkBoxImage14 + // + this.checkBoxImage14.Checked = false; + this.checkBoxImage14.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage14.Image"))); + this.checkBoxImage14.Location = new System.Drawing.Point(70, 468); + this.checkBoxImage14.Name = "checkBoxImage14"; + this.checkBoxImage14.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage14.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage14.TabIndex = 157; + this.checkBoxImage14.TabStop = false; + this.checkBoxImage14.Visible = false; + this.checkBoxImage14.Click += new System.EventHandler(this.checkBoxImage14_Click); + // + // checkBoxImage13 + // + this.checkBoxImage13.Checked = false; + this.checkBoxImage13.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage13.Image"))); + this.checkBoxImage13.Location = new System.Drawing.Point(70, 439); + this.checkBoxImage13.Name = "checkBoxImage13"; + this.checkBoxImage13.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage13.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage13.TabIndex = 156; + this.checkBoxImage13.TabStop = false; + this.checkBoxImage13.Visible = false; + this.checkBoxImage13.Click += new System.EventHandler(this.checkBoxImage13_Click); + // + // checkBoxImage12 + // + this.checkBoxImage12.Checked = false; + this.checkBoxImage12.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage12.Image"))); + this.checkBoxImage12.Location = new System.Drawing.Point(70, 410); + this.checkBoxImage12.Name = "checkBoxImage12"; + this.checkBoxImage12.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage12.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage12.TabIndex = 155; + this.checkBoxImage12.TabStop = false; + this.checkBoxImage12.Visible = false; + this.checkBoxImage12.Click += new System.EventHandler(this.checkBoxImage12_Click); + // + // checkBoxImage11 + // + this.checkBoxImage11.Checked = false; + this.checkBoxImage11.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage11.Image"))); + this.checkBoxImage11.Location = new System.Drawing.Point(70, 381); + this.checkBoxImage11.Name = "checkBoxImage11"; + this.checkBoxImage11.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage11.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage11.TabIndex = 154; + this.checkBoxImage11.TabStop = false; + this.checkBoxImage11.Visible = false; + this.checkBoxImage11.Click += new System.EventHandler(this.checkBoxImage11_Click); + // + // checkBoxImage10 + // + this.checkBoxImage10.Checked = false; + this.checkBoxImage10.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage10.Image"))); + this.checkBoxImage10.Location = new System.Drawing.Point(70, 352); + this.checkBoxImage10.Name = "checkBoxImage10"; + this.checkBoxImage10.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage10.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage10.TabIndex = 153; + this.checkBoxImage10.TabStop = false; + this.checkBoxImage10.Visible = false; + this.checkBoxImage10.Click += new System.EventHandler(this.checkBoxImage10_Click); + // + // checkBoxImage9 + // + this.checkBoxImage9.Checked = false; + this.checkBoxImage9.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage9.Image"))); + this.checkBoxImage9.Location = new System.Drawing.Point(70, 323); + this.checkBoxImage9.Name = "checkBoxImage9"; + this.checkBoxImage9.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage9.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage9.TabIndex = 152; + this.checkBoxImage9.TabStop = false; + this.checkBoxImage9.Visible = false; + this.checkBoxImage9.Click += new System.EventHandler(this.checkBoxImage9_Click); + // + // checkBoxImage8 + // + this.checkBoxImage8.Checked = false; + this.checkBoxImage8.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage8.Image"))); + this.checkBoxImage8.Location = new System.Drawing.Point(70, 294); + this.checkBoxImage8.Name = "checkBoxImage8"; + this.checkBoxImage8.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage8.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage8.TabIndex = 151; + this.checkBoxImage8.TabStop = false; + this.checkBoxImage8.Visible = false; + this.checkBoxImage8.Click += new System.EventHandler(this.checkBoxImage8_Click); + // + // checkBoxImage7 + // + this.checkBoxImage7.Checked = false; + this.checkBoxImage7.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage7.Image"))); + this.checkBoxImage7.Location = new System.Drawing.Point(70, 265); + this.checkBoxImage7.Name = "checkBoxImage7"; + this.checkBoxImage7.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage7.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage7.TabIndex = 150; + this.checkBoxImage7.TabStop = false; + this.checkBoxImage7.Visible = false; + this.checkBoxImage7.Click += new System.EventHandler(this.checkBoxImage7_Click); + // + // checkBoxImage6 + // + this.checkBoxImage6.Checked = false; + this.checkBoxImage6.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage6.Image"))); + this.checkBoxImage6.Location = new System.Drawing.Point(70, 236); + this.checkBoxImage6.Name = "checkBoxImage6"; + this.checkBoxImage6.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage6.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage6.TabIndex = 149; + this.checkBoxImage6.TabStop = false; + this.checkBoxImage6.Visible = false; + this.checkBoxImage6.Click += new System.EventHandler(this.checkBoxImage6_Click); + // + // checkBoxImage5 + // + this.checkBoxImage5.Checked = false; + this.checkBoxImage5.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage5.Image"))); + this.checkBoxImage5.Location = new System.Drawing.Point(70, 207); + this.checkBoxImage5.Name = "checkBoxImage5"; + this.checkBoxImage5.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage5.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage5.TabIndex = 148; + this.checkBoxImage5.TabStop = false; + this.checkBoxImage5.Visible = false; + this.checkBoxImage5.Click += new System.EventHandler(this.checkBoxImage5_Click); + // + // checkBoxImage4 + // + this.checkBoxImage4.Checked = false; + this.checkBoxImage4.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage4.Image"))); + this.checkBoxImage4.Location = new System.Drawing.Point(70, 178); + this.checkBoxImage4.Name = "checkBoxImage4"; + this.checkBoxImage4.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage4.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage4.TabIndex = 147; + this.checkBoxImage4.TabStop = false; + this.checkBoxImage4.Visible = false; + this.checkBoxImage4.Click += new System.EventHandler(this.checkBoxImage4_Click); + // + // checkBoxImage3 + // + this.checkBoxImage3.Checked = false; + this.checkBoxImage3.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage3.Image"))); + this.checkBoxImage3.Location = new System.Drawing.Point(70, 149); + this.checkBoxImage3.Name = "checkBoxImage3"; + this.checkBoxImage3.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage3.TabIndex = 146; + this.checkBoxImage3.TabStop = false; + this.checkBoxImage3.Visible = false; + this.checkBoxImage3.Click += new System.EventHandler(this.checkBoxImage3_Click); + // + // checkBoxImage2 + // + this.checkBoxImage2.Checked = false; + this.checkBoxImage2.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage2.Image"))); + this.checkBoxImage2.Location = new System.Drawing.Point(70, 120); + this.checkBoxImage2.Name = "checkBoxImage2"; + this.checkBoxImage2.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage2.TabIndex = 145; + this.checkBoxImage2.TabStop = false; + this.checkBoxImage2.Visible = false; + this.checkBoxImage2.Click += new System.EventHandler(this.checkBoxImage2_Click); + // + // checkBoxImage1 + // + this.checkBoxImage1.Checked = false; + this.checkBoxImage1.Image = ((System.Drawing.Image)(resources.GetObject("checkBoxImage1.Image"))); + this.checkBoxImage1.Location = new System.Drawing.Point(70, 91); + this.checkBoxImage1.Name = "checkBoxImage1"; + this.checkBoxImage1.Size = new System.Drawing.Size(32, 21); + this.checkBoxImage1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.checkBoxImage1.TabIndex = 144; + this.checkBoxImage1.TabStop = false; + this.checkBoxImage1.Visible = false; + this.checkBoxImage1.Click += new System.EventHandler(this.checkBoxImage1_Click); + // + // GenesisCommunicationForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkGray; + this.ClientSize = new System.Drawing.Size(1134, 800); + this.Controls.Add(this.sampleLabel3); + this.Controls.Add(this.sampleLabel2); + this.Controls.Add(this.sampleLabel1); + this.Controls.Add(this.samplePictureBox3); + this.Controls.Add(this.samplePictureBox2); + this.Controls.Add(this.samplePictureBox1); + this.Controls.Add(this.saveButton); + this.Controls.Add(this.checkBoxImage48); + this.Controls.Add(this.checkBoxImage47); + this.Controls.Add(this.checkBoxImage46); + this.Controls.Add(this.checkBoxImage45); + this.Controls.Add(this.checkBoxImage44); + this.Controls.Add(this.checkBoxImage43); + this.Controls.Add(this.checkBoxImage42); + this.Controls.Add(this.checkBoxImage41); + this.Controls.Add(this.checkBoxImage40); + this.Controls.Add(this.checkBoxImage39); + this.Controls.Add(this.checkBoxImage38); + this.Controls.Add(this.checkBoxImage37); + this.Controls.Add(this.checkBoxImage36); + this.Controls.Add(this.checkBoxImage35); + this.Controls.Add(this.checkBoxImage34); + this.Controls.Add(this.checkBoxImage33); + this.Controls.Add(this.checkBoxImage32); + this.Controls.Add(this.checkBoxImage31); + this.Controls.Add(this.checkBoxImage30); + this.Controls.Add(this.checkBoxImage29); + this.Controls.Add(this.checkBoxImage28); + this.Controls.Add(this.checkBoxImage27); + this.Controls.Add(this.checkBoxImage26); + this.Controls.Add(this.checkBoxImage25); + this.Controls.Add(this.checkBoxImage24); + this.Controls.Add(this.checkBoxImage23); + this.Controls.Add(this.checkBoxImage22); + this.Controls.Add(this.checkBoxImage21); + this.Controls.Add(this.checkBoxImage20); + this.Controls.Add(this.checkBoxImage19); + this.Controls.Add(this.checkBoxImage18); + this.Controls.Add(this.checkBoxImage17); + this.Controls.Add(this.checkBoxImage16); + this.Controls.Add(this.checkBoxImage15); + this.Controls.Add(this.checkBoxImage14); + this.Controls.Add(this.checkBoxImage13); + this.Controls.Add(this.checkBoxImage12); + this.Controls.Add(this.checkBoxImage11); + this.Controls.Add(this.checkBoxImage10); + this.Controls.Add(this.checkBoxImage9); + this.Controls.Add(this.checkBoxImage8); + this.Controls.Add(this.checkBoxImage7); + this.Controls.Add(this.checkBoxImage6); + this.Controls.Add(this.checkBoxImage5); + this.Controls.Add(this.checkBoxImage4); + this.Controls.Add(this.checkBoxImage3); + this.Controls.Add(this.checkBoxImage2); + this.Controls.Add(this.checkBoxImage1); + this.Controls.Add(this.pictureBox48); + this.Controls.Add(this.pictureBox47); + this.Controls.Add(this.pictureBox46); + this.Controls.Add(this.pictureBox45); + this.Controls.Add(this.pictureBox44); + this.Controls.Add(this.pictureBox43); + this.Controls.Add(this.pictureBox42); + this.Controls.Add(this.pictureBox41); + this.Controls.Add(this.pictureBox40); + this.Controls.Add(this.pictureBox39); + this.Controls.Add(this.pictureBox38); + this.Controls.Add(this.pictureBox37); + this.Controls.Add(this.pictureBox36); + this.Controls.Add(this.pictureBox35); + this.Controls.Add(this.pictureBox34); + this.Controls.Add(this.pictureBox33); + this.Controls.Add(this.pictureBox32); + this.Controls.Add(this.pictureBox31); + this.Controls.Add(this.pictureBox30); + this.Controls.Add(this.pictureBox29); + this.Controls.Add(this.pictureBox28); + this.Controls.Add(this.pictureBox27); + this.Controls.Add(this.pictureBox26); + this.Controls.Add(this.pictureBox25); + this.Controls.Add(this.pictureBox24); + this.Controls.Add(this.pictureBox23); + this.Controls.Add(this.pictureBox22); + this.Controls.Add(this.pictureBox21); + this.Controls.Add(this.pictureBox20); + this.Controls.Add(this.pictureBox19); + this.Controls.Add(this.pictureBox18); + this.Controls.Add(this.pictureBox17); + this.Controls.Add(this.pictureBox16); + this.Controls.Add(this.pictureBox15); + this.Controls.Add(this.pictureBox14); + this.Controls.Add(this.pictureBox13); + this.Controls.Add(this.pictureBox12); + this.Controls.Add(this.pictureBox11); + this.Controls.Add(this.pictureBox10); + this.Controls.Add(this.pictureBox9); + this.Controls.Add(this.pictureBox8); + this.Controls.Add(this.pictureBox7); + this.Controls.Add(this.pictureBox6); + this.Controls.Add(this.pictureBox5); + this.Controls.Add(this.pictureBox4); + this.Controls.Add(this.pictureBox3); + this.Controls.Add(this.pictureBox2); + this.Controls.Add(this.pictureBox1); + this.Controls.Add(this.activityLabel); + this.Controls.Add(this.wmTextBox48); + this.Controls.Add(this.wmLabel48); + this.Controls.Add(this.wmTextBox47); + this.Controls.Add(this.wmLabel47); + this.Controls.Add(this.wmTextBox46); + this.Controls.Add(this.wmLabel46); + this.Controls.Add(this.wmTextBox45); + this.Controls.Add(this.wmLabel45); + this.Controls.Add(this.wmTextBox44); + this.Controls.Add(this.wmLabel44); + this.Controls.Add(this.wmTextBox43); + this.Controls.Add(this.wmLabel43); + this.Controls.Add(this.wmTextBox42); + this.Controls.Add(this.wmLabel42); + this.Controls.Add(this.wmTextBox41); + this.Controls.Add(this.wmLabel41); + this.Controls.Add(this.wmTextBox40); + this.Controls.Add(this.wmLabel40); + this.Controls.Add(this.wmTextBox39); + this.Controls.Add(this.wmLabel39); + this.Controls.Add(this.wmTextBox38); + this.Controls.Add(this.wmLabel38); + this.Controls.Add(this.wmTextBox37); + this.Controls.Add(this.wmLabel37); + this.Controls.Add(this.wmTextBox36); + this.Controls.Add(this.wmLabel36); + this.Controls.Add(this.wmTextBox35); + this.Controls.Add(this.wmLabel35); + this.Controls.Add(this.wmTextBox34); + this.Controls.Add(this.wmLabel34); + this.Controls.Add(this.wmTextBox33); + this.Controls.Add(this.wmLabel33); + this.Controls.Add(this.wmTextBox32); + this.Controls.Add(this.wmLabel32); + this.Controls.Add(this.wmTextBox31); + this.Controls.Add(this.wmLabel31); + this.Controls.Add(this.wmTextBox30); + this.Controls.Add(this.wmLabel30); + this.Controls.Add(this.wmTextBox29); + this.Controls.Add(this.wmLabel29); + this.Controls.Add(this.wmTextBox28); + this.Controls.Add(this.wmLabel28); + this.Controls.Add(this.wmTextBox27); + this.Controls.Add(this.wmLabel27); + this.Controls.Add(this.wmTextBox26); + this.Controls.Add(this.wmLabel26); + this.Controls.Add(this.wmTextBox25); + this.Controls.Add(this.wmLabel25); + this.Controls.Add(this.wmTextBox24); + this.Controls.Add(this.wmLabel24); + this.Controls.Add(this.wmTextBox23); + this.Controls.Add(this.wmLabel23); + this.Controls.Add(this.wmTextBox22); + this.Controls.Add(this.wmLabel22); + this.Controls.Add(this.wmTextBox21); + this.Controls.Add(this.wmLabel21); + this.Controls.Add(this.wmTextBox20); + this.Controls.Add(this.wmLabel20); + this.Controls.Add(this.wmTextBox19); + this.Controls.Add(this.wmLabel19); + this.Controls.Add(this.wmTextBox18); + this.Controls.Add(this.wmLabel18); + this.Controls.Add(this.wmTextBox17); + this.Controls.Add(this.wmLabel17); + this.Controls.Add(this.wmTextBox16); + this.Controls.Add(this.wmLabel16); + this.Controls.Add(this.wmTextBox15); + this.Controls.Add(this.wmLabel15); + this.Controls.Add(this.wmTextBox14); + this.Controls.Add(this.wmLabel14); + this.Controls.Add(this.wmTextBox13); + this.Controls.Add(this.wmLabel13); + this.Controls.Add(this.wmTextBox12); + this.Controls.Add(this.wmLabel12); + this.Controls.Add(this.wmTextBox11); + this.Controls.Add(this.wmLabel11); + this.Controls.Add(this.wmTextBox10); + this.Controls.Add(this.wmLabel10); + this.Controls.Add(this.wmTextBox9); + this.Controls.Add(this.wmLabel9); + this.Controls.Add(this.wmTextBox8); + this.Controls.Add(this.wmLabel8); + this.Controls.Add(this.wmTextBox7); + this.Controls.Add(this.wmLabel7); + this.Controls.Add(this.wmTextBox6); + this.Controls.Add(this.wmLabel6); + this.Controls.Add(this.wmTextBox5); + this.Controls.Add(this.wmLabel5); + this.Controls.Add(this.wmTextBox4); + this.Controls.Add(this.wmLabel4); + this.Controls.Add(this.wmTextBox3); + this.Controls.Add(this.wmLabel3); + this.Controls.Add(this.wmTextBox2); + this.Controls.Add(this.wmLabel2); + this.Controls.Add(this.wmTextBox1); + this.Controls.Add(this.wmLabel1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "GenesisCommunicationForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "iPerl Communication"; + this.TopMost = true; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.GenesisCommunicationForm_FormClosing); + this.Load += new System.EventHandler(this.GenesisCommunicationForm_Load); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox48)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox47)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox46)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox45)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox44)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox43)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox42)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox41)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox40)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox39)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox38)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox37)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox36)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox35)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox34)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox33)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox32)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox31)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox30)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox29)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox28)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox27)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox26)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox25)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox24)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox23)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox22)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox21)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox20)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox19)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox18)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox17)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox16)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox15)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox14)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox13)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox12)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox11)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox10)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox9)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox8)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox7)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox6)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox5)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.samplePictureBox1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.samplePictureBox2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.samplePictureBox3)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage48)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage47)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage46)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage45)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage44)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage43)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage42)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage41)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage40)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage39)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage38)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage37)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage36)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage35)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage34)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage33)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage32)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage31)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage30)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage29)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage28)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage27)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage26)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage25)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage24)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage23)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage22)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage21)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage20)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage19)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage18)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage17)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage16)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage15)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage14)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage13)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage12)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage11)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage10)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage9)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage8)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage7)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage6)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage5)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage4)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage3)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.checkBoxImage1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox wmTextBox2; + private System.Windows.Forms.Label wmLabel2; + private System.Windows.Forms.Label wmLabel1; + private System.Windows.Forms.TextBox wmTextBox3; + private System.Windows.Forms.Label wmLabel3; + private System.Windows.Forms.TextBox wmTextBox4; + private System.Windows.Forms.Label wmLabel4; + private System.Windows.Forms.TextBox wmTextBox5; + private System.Windows.Forms.Label wmLabel5; + private System.Windows.Forms.TextBox wmTextBox6; + private System.Windows.Forms.Label wmLabel6; + private System.Windows.Forms.TextBox wmTextBox1; + private System.Windows.Forms.TextBox wmTextBox7; + private System.Windows.Forms.Label wmLabel7; + private System.Windows.Forms.TextBox wmTextBox8; + private System.Windows.Forms.Label wmLabel8; + private System.Windows.Forms.TextBox wmTextBox9; + private System.Windows.Forms.Label wmLabel9; + private System.Windows.Forms.TextBox wmTextBox10; + private System.Windows.Forms.Label wmLabel10; + private System.Windows.Forms.TextBox wmTextBox12; + private System.Windows.Forms.Label wmLabel12; + private System.Windows.Forms.TextBox wmTextBox11; + private System.Windows.Forms.Label wmLabel11; + private System.Windows.Forms.TextBox wmTextBox24; + private System.Windows.Forms.Label wmLabel24; + private System.Windows.Forms.TextBox wmTextBox23; + private System.Windows.Forms.Label wmLabel23; + private System.Windows.Forms.TextBox wmTextBox22; + private System.Windows.Forms.Label wmLabel22; + private System.Windows.Forms.TextBox wmTextBox21; + private System.Windows.Forms.Label wmLabel21; + private System.Windows.Forms.TextBox wmTextBox20; + private System.Windows.Forms.Label wmLabel20; + private System.Windows.Forms.TextBox wmTextBox19; + private System.Windows.Forms.Label wmLabel19; + private System.Windows.Forms.TextBox wmTextBox18; + private System.Windows.Forms.Label wmLabel18; + private System.Windows.Forms.TextBox wmTextBox17; + private System.Windows.Forms.Label wmLabel17; + private System.Windows.Forms.TextBox wmTextBox16; + private System.Windows.Forms.Label wmLabel16; + private System.Windows.Forms.TextBox wmTextBox15; + private System.Windows.Forms.Label wmLabel15; + private System.Windows.Forms.TextBox wmTextBox14; + private System.Windows.Forms.Label wmLabel14; + private System.Windows.Forms.TextBox wmTextBox13; + private System.Windows.Forms.Label wmLabel13; + private System.Windows.Forms.TextBox wmTextBox48; + private System.Windows.Forms.Label wmLabel48; + private System.Windows.Forms.TextBox wmTextBox47; + private System.Windows.Forms.Label wmLabel47; + private System.Windows.Forms.TextBox wmTextBox46; + private System.Windows.Forms.Label wmLabel46; + private System.Windows.Forms.TextBox wmTextBox45; + private System.Windows.Forms.Label wmLabel45; + private System.Windows.Forms.TextBox wmTextBox44; + private System.Windows.Forms.Label wmLabel44; + private System.Windows.Forms.TextBox wmTextBox43; + private System.Windows.Forms.Label wmLabel43; + private System.Windows.Forms.TextBox wmTextBox42; + private System.Windows.Forms.Label wmLabel42; + private System.Windows.Forms.TextBox wmTextBox41; + private System.Windows.Forms.Label wmLabel41; + private System.Windows.Forms.TextBox wmTextBox40; + private System.Windows.Forms.Label wmLabel40; + private System.Windows.Forms.TextBox wmTextBox39; + private System.Windows.Forms.Label wmLabel39; + private System.Windows.Forms.TextBox wmTextBox38; + private System.Windows.Forms.Label wmLabel38; + private System.Windows.Forms.TextBox wmTextBox37; + private System.Windows.Forms.Label wmLabel37; + private System.Windows.Forms.TextBox wmTextBox36; + private System.Windows.Forms.Label wmLabel36; + private System.Windows.Forms.TextBox wmTextBox35; + private System.Windows.Forms.Label wmLabel35; + private System.Windows.Forms.TextBox wmTextBox34; + private System.Windows.Forms.Label wmLabel34; + private System.Windows.Forms.TextBox wmTextBox33; + private System.Windows.Forms.Label wmLabel33; + private System.Windows.Forms.TextBox wmTextBox32; + private System.Windows.Forms.Label wmLabel32; + private System.Windows.Forms.TextBox wmTextBox31; + private System.Windows.Forms.Label wmLabel31; + private System.Windows.Forms.TextBox wmTextBox30; + private System.Windows.Forms.Label wmLabel30; + private System.Windows.Forms.TextBox wmTextBox29; + private System.Windows.Forms.Label wmLabel29; + private System.Windows.Forms.TextBox wmTextBox28; + private System.Windows.Forms.Label wmLabel28; + private System.Windows.Forms.TextBox wmTextBox27; + private System.Windows.Forms.Label wmLabel27; + private System.Windows.Forms.TextBox wmTextBox26; + private System.Windows.Forms.Label wmLabel26; + private System.Windows.Forms.TextBox wmTextBox25; + private System.Windows.Forms.Label wmLabel25; + private System.Windows.Forms.Label activityLabel; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.PictureBox pictureBox2; + private System.Windows.Forms.PictureBox pictureBox3; + private System.Windows.Forms.PictureBox pictureBox4; + private System.Windows.Forms.PictureBox pictureBox5; + private System.Windows.Forms.PictureBox pictureBox6; + private System.Windows.Forms.PictureBox pictureBox7; + private System.Windows.Forms.PictureBox pictureBox8; + private System.Windows.Forms.PictureBox pictureBox9; + private System.Windows.Forms.PictureBox pictureBox10; + private System.Windows.Forms.PictureBox pictureBox11; + private System.Windows.Forms.PictureBox pictureBox12; + private System.Windows.Forms.PictureBox pictureBox13; + private System.Windows.Forms.PictureBox pictureBox14; + private System.Windows.Forms.PictureBox pictureBox15; + private System.Windows.Forms.PictureBox pictureBox16; + private System.Windows.Forms.PictureBox pictureBox17; + private System.Windows.Forms.PictureBox pictureBox18; + private System.Windows.Forms.PictureBox pictureBox19; + private System.Windows.Forms.PictureBox pictureBox20; + private System.Windows.Forms.PictureBox pictureBox21; + private System.Windows.Forms.PictureBox pictureBox22; + private System.Windows.Forms.PictureBox pictureBox23; + private System.Windows.Forms.PictureBox pictureBox24; + private System.Windows.Forms.PictureBox pictureBox25; + private System.Windows.Forms.PictureBox pictureBox26; + private System.Windows.Forms.PictureBox pictureBox27; + private System.Windows.Forms.PictureBox pictureBox28; + private System.Windows.Forms.PictureBox pictureBox29; + private System.Windows.Forms.PictureBox pictureBox30; + private System.Windows.Forms.PictureBox pictureBox31; + private System.Windows.Forms.PictureBox pictureBox32; + private System.Windows.Forms.PictureBox pictureBox33; + private System.Windows.Forms.PictureBox pictureBox34; + private System.Windows.Forms.PictureBox pictureBox35; + private System.Windows.Forms.PictureBox pictureBox36; + private System.Windows.Forms.PictureBox pictureBox37; + private System.Windows.Forms.PictureBox pictureBox38; + private System.Windows.Forms.PictureBox pictureBox39; + private System.Windows.Forms.PictureBox pictureBox40; + private System.Windows.Forms.PictureBox pictureBox41; + private System.Windows.Forms.PictureBox pictureBox42; + private System.Windows.Forms.PictureBox pictureBox43; + private System.Windows.Forms.PictureBox pictureBox44; + private System.Windows.Forms.PictureBox pictureBox45; + private System.Windows.Forms.PictureBox pictureBox46; + private System.Windows.Forms.PictureBox pictureBox47; + private System.Windows.Forms.PictureBox pictureBox48; + private CheckBoxImage checkBoxImage1; + private CheckBoxImage checkBoxImage2; + private CheckBoxImage checkBoxImage3; + private CheckBoxImage checkBoxImage4; + private CheckBoxImage checkBoxImage5; + private CheckBoxImage checkBoxImage6; + private CheckBoxImage checkBoxImage7; + private CheckBoxImage checkBoxImage8; + private CheckBoxImage checkBoxImage9; + private CheckBoxImage checkBoxImage10; + private CheckBoxImage checkBoxImage11; + private CheckBoxImage checkBoxImage12; + private CheckBoxImage checkBoxImage13; + private CheckBoxImage checkBoxImage14; + private CheckBoxImage checkBoxImage15; + private CheckBoxImage checkBoxImage16; + private CheckBoxImage checkBoxImage17; + private CheckBoxImage checkBoxImage18; + private CheckBoxImage checkBoxImage19; + private CheckBoxImage checkBoxImage20; + private CheckBoxImage checkBoxImage21; + private CheckBoxImage checkBoxImage22; + private CheckBoxImage checkBoxImage23; + private CheckBoxImage checkBoxImage24; + private CheckBoxImage checkBoxImage25; + private CheckBoxImage checkBoxImage26; + private CheckBoxImage checkBoxImage27; + private CheckBoxImage checkBoxImage28; + private CheckBoxImage checkBoxImage29; + private CheckBoxImage checkBoxImage30; + private CheckBoxImage checkBoxImage31; + private CheckBoxImage checkBoxImage32; + private CheckBoxImage checkBoxImage33; + private CheckBoxImage checkBoxImage34; + private CheckBoxImage checkBoxImage35; + private CheckBoxImage checkBoxImage36; + private CheckBoxImage checkBoxImage37; + private CheckBoxImage checkBoxImage38; + private CheckBoxImage checkBoxImage39; + private CheckBoxImage checkBoxImage40; + private CheckBoxImage checkBoxImage41; + private CheckBoxImage checkBoxImage42; + private CheckBoxImage checkBoxImage43; + private CheckBoxImage checkBoxImage44; + private CheckBoxImage checkBoxImage45; + private CheckBoxImage checkBoxImage46; + private CheckBoxImage checkBoxImage47; + private CheckBoxImage checkBoxImage48; + private System.Windows.Forms.Button saveButton; + private System.Windows.Forms.PictureBox samplePictureBox1; + private System.Windows.Forms.PictureBox samplePictureBox2; + private System.Windows.Forms.PictureBox samplePictureBox3; + private System.Windows.Forms.Label sampleLabel1; + private System.Windows.Forms.Label sampleLabel2; + private System.Windows.Forms.Label sampleLabel3; + + } +} diff --git a/TBF/Rig/TestMethods/GenesisCommunication/GenesisCommunicationForm.resx b/TBF/Rig/TestMethods/GenesisCommunication/GenesisCommunicationForm.resx new file mode 100644 index 000000000..09b27b8f1 --- /dev/null +++ b/TBF/Rig/TestMethods/GenesisCommunication/GenesisCommunicationForm.resx @@ -0,0 +1,3577 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + 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 + + + diff --git a/TBF/Rig/TestMethods/GenesisCommunication/GenesisCommunicationSeq.cs b/TBF/Rig/TestMethods/GenesisCommunication/GenesisCommunicationSeq.cs index d92314a73..7c23bee5e 100644 --- a/TBF/Rig/TestMethods/GenesisCommunication/GenesisCommunicationSeq.cs +++ b/TBF/Rig/TestMethods/GenesisCommunication/GenesisCommunicationSeq.cs @@ -32,15 +32,15 @@ namespace TBF.Rig.TestMethods.GenesisCommunication System.Windows.Forms.Form modelessDlg; /// - delegate void iPerlCommFormDlgt(GenesisCommunicationSeq myRef, iPerlCommunication.TestMethod method, Test test, iPerlCommunicationParams testParams); + delegate void iPerlCommFormDlgt(GenesisCommunicationSeq myRef, TestMethod method, Test test, iPerlCommunicationParams testParams); /// - void OpenIPerlCommForm(GenesisCommunicationSeq myRef, iPerlCommunication.TestMethod method, Test test, iPerlCommunicationParams testParams) + void OpenIPerlCommForm(GenesisCommunicationSeq myRef, TestMethod method, Test test, iPerlCommunicationParams testParams) { //TODO solve this wia SmartCommunicationForm - throw new NotImplementedException(); - //myRef.modelessDlg = new iPerlCommunicationForm(method, test, testParams); - //myRef.modelessDlg.Show(); + + myRef.modelessDlg = new GenesisCommunicationForm(method, test, testParams); + myRef.modelessDlg.Show(); } @@ -72,7 +72,7 @@ namespace TBF.Rig.TestMethods.GenesisCommunication processDataLoggingOp = new TBF.Rig.Operations.ProcessDataLoggingOp(processDataLogger, this, false); string cmd; - if (testParams.Activity.ToLower().Equals(cmd = iPerlCommunicationForm.GetDefaultQ2CorrectionsStr.ToLower())) + if (testParams.Activity.ToLower().Equals(cmd = GenesisCommunicationForm.GetDefaultQ2CorrectionsStr.ToLower())) { TestProgressEventArgs.SetEstimatedTimes(new int[] { 0, 0, 0, 30, 0, 30, 0, 0 }); Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Progress.JustStarted)); diff --git a/TBF/Rig/TestMethods/GenesisCommunication/TestMethodCfg.cs b/TBF/Rig/TestMethods/GenesisCommunication/TestMethodCfg.cs index 047baf675..e35cd3b8e 100644 --- a/TBF/Rig/TestMethods/GenesisCommunication/TestMethodCfg.cs +++ b/TBF/Rig/TestMethods/GenesisCommunication/TestMethodCfg.cs @@ -33,13 +33,13 @@ namespace TBF.Rig.TestMethods.GenesisCommunication /// Private parameterless constructor invoked by all other (public) constructors TestMethodCfg() { - Name = "SmartCommunication"; + Name = "SmartCommunicationGenesis"; ParentName = string.Empty; CommTimeout = 1800; /// ms MaxCommRetries = 4; WaitTimeAfterFailure = 2200; PassThroughWaitTime = 1500; - NrThreads = 2; /// 1, 2 or 4 threads + NrThreads = 10; /// 1, 2 or 4 threads IperlCheckErrorsToStop = 10; MciTimeoutMs = 4000; // ms, NFC interface BaudRate = 57600; // NFC Interface diff --git a/TBF/Rig/TestMethods/GenesisCommunication/TestMethodCfgCtrl.cs b/TBF/Rig/TestMethods/GenesisCommunication/TestMethodCfgCtrl.cs index a3ca06902..1c86b0cf9 100644 --- a/TBF/Rig/TestMethods/GenesisCommunication/TestMethodCfgCtrl.cs +++ b/TBF/Rig/TestMethods/GenesisCommunication/TestMethodCfgCtrl.cs @@ -28,6 +28,14 @@ namespace TBF.Rig.TestMethods.GenesisCommunication public TestMethodCfgCtrl() { InitializeComponent(); + dfltQ2corrFactorsGroupBox.Visible = false; + useWebServiceGroupBox.Visible = false; + var factorHint = new System.Windows.Forms.Label + { + AutoSize = true, Location = dfltQ2corrFactorsGroupBox.Location, + Text = "Q3 factors: Water meters / Text1, Text2, Text3 (CH1, CH2, CH3)." + }; + Controls.Add(factorHint); } private void EntryFormCfgCtrl_Load(object sender, EventArgs e) @@ -116,10 +124,10 @@ namespace TBF.Rig.TestMethods.GenesisCommunication flags |= CfgUpdateFlags.Error; message += Environment.NewLine + "'Comm. timeout' should be in range 0 .. 5000"; } - if (!int.TryParse(nrThreadsTextBox.Text, out dummy) || (dummy != 1 && dummy != 2 && dummy != 4)) + if (!int.TryParse(nrThreadsTextBox.Text, out dummy) || (dummy < 1 || dummy > 10)) { flags |= CfgUpdateFlags.Error; - message += Environment.NewLine + "'Nr. threads' should be 1, 2 or 4"; + message += Environment.NewLine + "'Nr. threads' should be in range 1 .. 10"; } if (!int.TryParse(iperlCheckErrorsToStopTextBox.Text, out dummy) || ((dummy < 1) && (dummy > 40))) { diff --git a/TBF/Rig/TestMethods/GenesisCommunication/iPerlCommunicationParams.cs b/TBF/Rig/TestMethods/GenesisCommunication/iPerlCommunicationParams.cs index 82fa52edb..fa1cfd1f3 100644 --- a/TBF/Rig/TestMethods/GenesisCommunication/iPerlCommunicationParams.cs +++ b/TBF/Rig/TestMethods/GenesisCommunication/iPerlCommunicationParams.cs @@ -10,7 +10,6 @@ using Config.Entities; using TBF.Resources; using TBF.Rig.Generic; using TBF.Rig.TestMethods.iPerlCommunication; -using TBF.Rig.Uni.SharedDialogs.SmartMetersCommunication; namespace TBF.Rig.TestMethods.GenesisCommunication { @@ -31,7 +30,7 @@ namespace TBF.Rig.TestMethods.GenesisCommunication public override void InitializeAll() { - Activity = iPerlCommunicationForm.ReadConfigurationStr; + Activity = GenesisCommunicationForm.SlotInitializeStr; SimultWithPrevious = false; SimultWithNext = false; } @@ -51,62 +50,79 @@ namespace TBF.Rig.TestMethods.GenesisCommunication if (i == 0) { var retVal = new List(); - retVal.Add(iPerlCommunicationForm.ReadConfigurationStr); - retVal.Add(iPerlCommunicationConstants.ReadAdditionalCommonParametersStr); - retVal.Add(iPerlCommunicationForm.ReadSerialNrStr); - retVal.Add(string.Format("{0} A0", iPerlCommunicationForm.SetTestModeStr)); - retVal.Add(string.Format("{0} A4", iPerlCommunicationForm.SetTestModeStr)); - retVal.Add(iPerlCommunicationForm.ReadCalibrationStr); - retVal.Add(iPerlCommunicationForm.ReadCalibrationV4Str); - retVal.Add(iPerlCommunicationForm.NormalizeCalibrationFactorStr); - retVal.Add(iPerlCommunicationForm.NormalizeCalibrationV4FactorsStr); - retVal.Add(iPerlCommunicationForm.GetDefaultQ2CorrectionsStr); - retVal.Add(iPerlCommunicationForm.ReadQ2CorrectionStr); - retVal.Add(iPerlCommunicationForm.ResetQ2CorrectionStr); - retVal.Add(iPerlCommunicationForm.WriteDefaultQ2CorrectionsStr); - retVal.Add(iPerlCommunicationForm.InitOrReadQ2CorrectionsStr); - retVal.Add(iPerlCommunicationForm.WriteCalibrationFactorStr); - retVal.Add(iPerlCommunicationForm.WriteCalibrationV4FactorsStr); - retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionStr); - retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionAltStr); - retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionGreeceStr); - retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionRLStr); - retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionLRStr); - retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionIncl05Str); - retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionAltIncl05Str); - retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionPlusIncl05Str); - retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionPlusAltIncl05Str); - retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionGreeceIncl05Str); - retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionRLIncl05Str); - retVal.Add(iPerlCommunicationForm.WriteQ2CorrectionLRIncl05Str); - retVal.Add(iPerlCommunicationSeq.Q2correctedFromCmd + "Qx"); - retVal.Add(iPerlCommunicationSeq.StrictQ2ErrorCheckStr + "Qx"); - retVal.Add(iPerlCommunicationSeq.Q2correctionCheckCmd); - retVal.Add(iPerlCommunicationSeq.IperlCheckCmd); - retVal.Add(iPerlCommunicationForm.UpdateBothQ2FactorsTestRLOnlyStr); - retVal.Add(iPerlCommunicationForm.UpdateBothQ2FactorsTestLROnlyStr); - retVal.Add(iPerlCommunicationForm.UpdateQ2CorrectionsStr); - retVal.Add(iPerlCommunicationForm.ConditnlUpdateQ2CorrectionsStr); - retVal.Add(iPerlCommunicationForm.ConditnlUpdateQ2CorrRLStr); - retVal.Add(iPerlCommunicationForm.ConditnlUpdateQ2CorrLRStr); - retVal.Add("Q2 corrected from Q2adj"); - retVal.Add("Q2 correction check Q2bc Q2ac"); - retVal.Add(iPerlCommunicationForm.SetActiveModeStr); - retVal.Add(iPerlCommunicationForm.SetIdleModeStr); - retVal.Add("---"); - retVal.Add(iPerlCommunicationForm.Reset2HzCorrectionStr); - retVal.Add(iPerlCommunicationForm.Write2HzCorrectionStr); - retVal.Add(iPerlCommunicationForm.DewaReworkRLStr); - retVal.Add(iPerlCommunicationForm.DewaReworkLRStr); - retVal.Add(iPerlCommunicationForm.StartTestingSealedMetersStr); - retVal.Add(iPerlCommunicationForm.EndTestingSealedMetersStr); - retVal.Add(string.Format("{0} if enabled", iPerlCommunicationForm.ReadConfigurationStr)); - retVal.Add(string.Format("{0} 80", iPerlCommunicationForm.SetTestModeStr)); - retVal.Add("iPerl_check prevWorkStep direction q2factors"); - for (iPerlCommunication.ConditionID id = iPerlCommunication.ConditionID.A; id < iPerlCommunication.ConditionID.Count; id++) - { - retVal.Add(string.Format(iPerlCommunication.SequenceConditionOp.ConditionNameFmt, id)); - } + + retVal.Add(GenesisCommunicationForm.SlotInitializeStr); + retVal.Add(GenesisCommunicationForm.SlotUpdateStr); + retVal.Add(GenesisCommunicationForm.SlotConnectStr); + retVal.Add(GenesisCommunicationForm.SlotPCBSlotStr); + retVal.Add(GenesisCommunicationForm.SlotSetPasswordStr); + retVal.Add(GenesisCommunicationForm.SlotLoginStr); + retVal.Add(GenesisCommunicationForm.SlotGroupedLoginStr); + retVal.Add(GenesisCommunicationForm.SlotSetTestModeStr); + retVal.Add(GenesisCommunicationForm.SlotSetActiveModeStr); + retVal.Add(GenesisCommunicationForm.SlotDisconnectStr); + retVal.Add(GenesisCommunicationForm.PrepareSlotQ3CalibrationStr); + retVal.Add(GenesisCommunicationForm.WriteSlotQ3CalibrationStr); + retVal.Add(GenesisCommunicationForm.CheckMeterPrepareStr); + retVal.Add(GenesisCommunicationForm.HoldSlotStr); + + + + // retVal.Add(GenesisCommunicationForm.ReadConfigurationStr); + // retVal.Add(GenesisCommunicationForm.ReadSerialNrStr); + // retVal.Add(string.Format("{0} A0", GenesisCommunicationForm.SetTestModeStr)); + // retVal.Add(string.Format("{0} A4", GenesisCommunicationForm.SetTestModeStr)); + // retVal.Add(GenesisCommunicationForm.ReadCalibrationStr); + // retVal.Add(GenesisCommunicationForm.ReadCalibrationV4Str); + // retVal.Add(GenesisCommunicationForm.NormalizeCalibrationFactorStr); + // retVal.Add(GenesisCommunicationForm.NormalizeCalibrationV4FactorsStr); + // retVal.Add(GenesisCommunicationForm.GetDefaultQ2CorrectionsStr); + // retVal.Add(GenesisCommunicationForm.ReadQ2CorrectionStr); + // retVal.Add(GenesisCommunicationForm.ResetQ2CorrectionStr); + // retVal.Add(GenesisCommunicationForm.WriteDefaultQ2CorrectionsStr); + // retVal.Add(GenesisCommunicationForm.InitOrReadQ2CorrectionsStr); + // retVal.Add(GenesisCommunicationForm.WriteCalibrationFactorStr); + // retVal.Add(GenesisCommunicationForm.WriteCalibrationV4FactorsStr); + // retVal.Add(GenesisCommunicationForm.WriteQ2CorrectionStr); + // retVal.Add(GenesisCommunicationForm.WriteQ2CorrectionAltStr); + // retVal.Add(GenesisCommunicationForm.WriteQ2CorrectionGreeceStr); + // retVal.Add(GenesisCommunicationForm.WriteQ2CorrectionRLStr); + // retVal.Add(GenesisCommunicationForm.WriteQ2CorrectionLRStr); + // retVal.Add(GenesisCommunicationForm.WriteQ2CorrectionIncl05Str); + // retVal.Add(GenesisCommunicationForm.WriteQ2CorrectionAltIncl05Str); + // retVal.Add(GenesisCommunicationForm.WriteQ2CorrectionPlusIncl05Str); + // retVal.Add(GenesisCommunicationForm.WriteQ2CorrectionPlusAltIncl05Str); + // retVal.Add(GenesisCommunicationForm.WriteQ2CorrectionGreeceIncl05Str); + // retVal.Add(GenesisCommunicationForm.WriteQ2CorrectionRLIncl05Str); + // retVal.Add(GenesisCommunicationForm.WriteQ2CorrectionLRIncl05Str); + // retVal.Add(iPerlCommunicationSeq.Q2correctedFromCmd + "Qx"); + // retVal.Add(iPerlCommunicationSeq.StrictQ2ErrorCheckStr + "Qx"); + // retVal.Add(iPerlCommunicationSeq.Q2correctionCheckCmd); + // retVal.Add(iPerlCommunicationSeq.IperlCheckCmd); + // retVal.Add(GenesisCommunicationForm.UpdateBothQ2FactorsTestRLOnlyStr); + // retVal.Add(GenesisCommunicationForm.UpdateBothQ2FactorsTestLROnlyStr); + // retVal.Add(GenesisCommunicationForm.UpdateQ2CorrectionsStr); + // retVal.Add(GenesisCommunicationForm.ConditnlUpdateQ2CorrectionsStr); + // retVal.Add(GenesisCommunicationForm.ConditnlUpdateQ2CorrRLStr); + // retVal.Add(GenesisCommunicationForm.ConditnlUpdateQ2CorrLRStr); + // retVal.Add("Q2 corrected from Q2adj"); + // retVal.Add("Q2 correction check Q2bc Q2ac"); + // retVal.Add(GenesisCommunicationForm.SetActiveModeStr); + // retVal.Add(GenesisCommunicationForm.SetIdleModeStr); + // retVal.Add("---"); + // retVal.Add(GenesisCommunicationForm.Reset2HzCorrectionStr); + // retVal.Add(GenesisCommunicationForm.Write2HzCorrectionStr); + // retVal.Add(GenesisCommunicationForm.DewaReworkRLStr); + // retVal.Add(GenesisCommunicationForm.DewaReworkLRStr); + // retVal.Add(GenesisCommunicationForm.StartTestingSealedMetersStr); + // retVal.Add(GenesisCommunicationForm.EndTestingSealedMetersStr); + // retVal.Add(string.Format("{0} if enabled", GenesisCommunicationForm.ReadConfigurationStr)); + // retVal.Add(string.Format("{0} 80", GenesisCommunicationForm.SetTestModeStr)); + // retVal.Add("iPerl_check prevWorkStep direction q2factors"); + // for (ConditionID id = ConditionID.A; id < ConditionID.Count; id++) + // { + // retVal.Add(string.Format(SequenceConditionOp.ConditionNameFmt, id)); + // } return retVal; } diff --git a/TBF/TBF.csproj b/TBF/TBF.csproj index 7f0d54ed7..b7e3b9f08 100644 --- a/TBF/TBF.csproj +++ b/TBF/TBF.csproj @@ -4653,4 +4653,18 @@ --> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TBFTests/GenesisRecoveryTests.cs b/TBFTests/GenesisRecoveryTests.cs new file mode 100644 index 000000000..a44d48f4a --- /dev/null +++ b/TBFTests/GenesisRecoveryTests.cs @@ -0,0 +1,179 @@ +using System; +using System.Data.SQLite; +using System.IO; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Results.Entities; +using Results.Entities.helpers; +using GenesisCalibrationFactors = TBF.Rig.TestMethods.GenesisCommunication.GenesisCalibrationFactors; + +namespace TBFTests +{ + [TestClass] + public class GenesisRecoveryTests + { + [TestMethod] + public void TextFieldsPreserveConfiguredFactors() + { + double[] factors; string error; + Assert.IsTrue(GenesisCalibrationFactors.TryParse("17969", "17969", "17969", out factors, out error)); + CollectionAssert.AreEqual(new double[] { 17969, 17969, 17969 }, factors); + Assert.IsTrue(GenesisCalibrationFactors.TryParse(" 17969 ", "18000", "19000", out factors, out error)); + CollectionAssert.AreEqual(new double[] { 17969, 18000, 19000 }, factors); + } + + [TestMethod] + public void IncompleteOrInvalidFactorsAreRejectedBeforeWriting() + { + foreach (var invalid in new[] { null, "", "0", "-1", "65536", "NaN", "1.5", "bad" }) + { + double[] factors; string error; + Assert.IsFalse(GenesisCalibrationFactors.TryParse("17969", invalid, "17969", out factors, out error)); + Assert.IsNull(factors); + StringAssert.Contains(error, "Text2"); + } + } + + [TestMethod] + public void EmptyLegacyConfigurationKeepsDefault() + { + double[] factors; string error; + Assert.IsTrue(GenesisCalibrationFactors.TryParse(null, " ", "", out factors, out error)); + CollectionAssert.AreEqual(new double[] { 15625, 15625, 15625 }, factors); + } + + [TestMethod] + public void MultipleMetersHaveIndependentStableChannelRecords() + { + var test = new TestRslt(); + var first = new WaterMeter { WMPosition = 1 }; + var second = new WaterMeter { WMPosition = 2 }; + var a = test.GetCalibrationFactors(first); + var b = test.GetCalibrationFactors(second); + a[0].BaseCalibFactor = 17969; + b[0].BaseCalibFactor = 19000; + Assert.AreEqual(6, test.CalibFactorResultsToSave.Count); + Assert.AreSame(a[0], test.GetCalibrationFactors(first)[0]); + Assert.AreEqual(17969, a[0].BaseCalibFactor); + Assert.AreEqual(19000, b[0].BaseCalibFactor); + for (int i = 0; i < 3; i++) Assert.AreEqual(i + 1, b[i].CalibFactorIndex); + } + + [TestMethod] + public void GenesisFactoryAndProcedureActivitiesAreAvailable() + { + var factory = TBF.Rig.TbfComponents.CmpntFactoryFromClassName("TestMethods.GenesisCommunication"); + Assert.IsNotNull(factory); + var config = factory.DefaultConfig() as TBF.Rig.TestMethods.GenesisCommunication.TestMethodCfg; + Assert.IsNotNull(config); + Assert.AreEqual(10, config.NrThreads); + var parameters = new TBF.Rig.TestMethods.GenesisCommunication.iPerlCommunicationParams(true); + CollectionAssert.Contains(new System.Collections.Generic.List(parameters.ParamValues(0)), "Prepare Q3 Calibration Slot"); + Assert.IsNotNull(TBF.Rig.TbfComponents.CmpntFactoryFromClassName("TestMethods.iPerlCommunication")); + } + + [TestMethod] + public void MappedCalibrationRecordsRoundTripForTwoMeters() + { + string path = Path.Combine(Path.GetTempPath(), "genesis-roundtrip-" + Guid.NewGuid() + ".sqlite"); + var previousType = Results.DB.DbType; + var previousConnection = Results.DB.ConnectionString; + var previousFactory = Results.DB.SessionFactory; + try + { + Results.DB.DbType = Common.DBType.SQLite; + Results.DB.ConnectionString = path; + using (var factory = Results.DB.CreateSessionFactory(true)) + { + int testId; + using (var session = factory.OpenSession()) + using (var transaction = session.BeginTransaction()) + { + var test = new TestRslt(); + session.Save(test); + testId = test.Id; + for (int meter = 1; meter <= 2; meter++) + foreach (var factor in test.GetCalibrationFactors(new WaterMeter { WMPosition = meter })) + { + factor.BaseCalibFactor = 17969 + meter; + factor.CalculatedCalibFactor = 18000 + meter; + factor.Stored = true; + factor.IsCalibFactorValid = true; + session.Save(factor); + } + transaction.Commit(); + } + DatabaseMigrationHelper.EnsureSchema(Common.DBType.SQLite, path); + using (var session = factory.OpenSession()) + { + var rows = TestRsltCalibFactorHelper.GetByTestRsltId(session, testId); + Assert.AreEqual(6, rows.Count); + foreach (var row in rows) + { + Assert.AreEqual(17969 + row.WaterMeterPosition, row.BaseCalibFactor); + Assert.IsTrue(row.Stored); + Assert.IsTrue(row.IsCalibFactorValid); + } + } + } + } + finally + { + Results.DB.DbType = previousType; + Results.DB.ConnectionString = previousConnection; + Results.DB.SessionFactory = previousFactory; + SQLiteConnection.ClearAllPools(); + if (File.Exists(path)) File.Delete(path); + } + } + + // This test creates a temporary schema at runtime; no IDE data source exists. + // ReSharper disable SqlResolve + [TestMethod] + public void SQLiteEnsureCreatesAndUpgradesWithoutLosingExistingData() + { + string path = Path.Combine(Path.GetTempPath(), "genesis-migration-" + Guid.NewGuid() + ".sqlite"); + try + { + using (var connection = new SQLiteConnection("Data Source=" + path)) + { + connection.Open(); + Execute(connection, "CREATE TABLE WaterMeterData(Id INTEGER PRIMARY KEY)"); + Execute(connection, "CREATE TABLE WaterMeter(Id INTEGER PRIMARY KEY, CalibFactorNominal REAL NOT NULL DEFAULT 4096)"); + Execute(connection, "CREATE TABLE MeterTestRslt(Id INTEGER PRIMARY KEY, FlipMode INT NULL)"); + Execute(connection, "INSERT INTO WaterMeter(Id, CalibFactorNominal) VALUES(1, 17969)"); + Execute(connection, "INSERT INTO MeterTestRslt(Id, FlipMode) VALUES(1, 7)"); + // Simulate a partially migrated database from a previous special build. + Execute(connection, "CREATE TABLE TestRsltCalibFactor(Id INTEGER PRIMARY KEY, TestRsltId INT)"); + Execute(connection, "INSERT INTO TestRsltCalibFactor(Id, TestRsltId) VALUES(1, 12)"); + } + DatabaseMigrationHelper.EnsureSchema(Common.DBType.SQLite, path); + DatabaseMigrationHelper.EnsureSchema(Common.DBType.SQLite, path); + using (var connection = new SQLiteConnection("Data Source=" + path)) + { + connection.Open(); + Assert.AreEqual(17969d, Convert.ToDouble(Scalar(connection, "SELECT CalibFactorNominal FROM WaterMeter WHERE Id=1"))); + Assert.AreEqual(7L, Convert.ToInt64(Scalar(connection, "SELECT FlipMode FROM MeterTestRslt WHERE Id=1"))); + Assert.AreEqual(0L, Convert.ToInt64(Scalar(connection, "SELECT Q3Channel FROM WaterMeter WHERE Id=1"))); + Assert.AreEqual(12L, Convert.ToInt64(Scalar(connection, "SELECT TestRsltId FROM TestRsltCalibFactor WHERE Id=1"))); + Execute(connection, "UPDATE TestRsltCalibFactor SET WaterMeterPosition=2, CalibFactorIndex=3, BaseCalibFactor=17969, IsCalibFactorValid=1, Stored=1 WHERE Id=1"); + Assert.AreEqual(17969L, Convert.ToInt64(Scalar(connection, "SELECT BaseCalibFactor FROM TestRsltCalibFactor WHERE WaterMeterPosition=2 AND CalibFactorIndex=3"))); + Assert.AreEqual(0L, Convert.ToInt64(Scalar(connection, "SELECT COUNT(*) FROM MeterTestCalibFactorRslt"))); + } + } + finally { SQLiteConnection.ClearAllPools(); if (File.Exists(path)) File.Delete(path); } + } + + // ReSharper restore SqlResolve + + private static void Execute(SQLiteConnection connection, string sql) + { + using (var command = connection.CreateCommand()) { command.CommandText = sql; command.ExecuteNonQuery(); } + } + + private static object Scalar(SQLiteConnection connection, string sql) + { + using (var command = connection.CreateCommand()) { command.CommandText = sql; return command.ExecuteScalar(); } + } + } +} + diff --git a/TBFTests/TBFTests.csproj b/TBFTests/TBFTests.csproj index acad0b64e..c65733cf5 100644 --- a/TBFTests/TBFTests.csproj +++ b/TBFTests/TBFTests.csproj @@ -1,4 +1,4 @@ - + @@ -63,6 +63,13 @@ ..\packages\Moq.4.20.70\lib\net462\Moq.dll + + ..\packages\NHibernate.4.0.4.4000\lib\net40\NHibernate.dll + + + + ..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.119.0\lib\net46\System.Data.SQLite.dll + ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll @@ -207,10 +214,12 @@ + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + @@ -222,4 +231,11 @@ --> + + + + + diff --git a/TBFTests/packages.config b/TBFTests/packages.config index f42fcfa3a..ef181d5a2 100644 --- a/TBFTests/packages.config +++ b/TBFTests/packages.config @@ -1,4 +1,4 @@ - + @@ -14,4 +14,7 @@ + + + \ No newline at end of file